![](/img/trans.png)
[英]Anagram of 2 string : I don't understand what is the problem with my code
[英]I don't understand why my sort on a string breaks everything
我有以下代碼:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
vector<vector<string>> findAnagrams(vector<string> wordlist) {
vector<vector<string>> result;
unordered_map<string, vector<string>*> indexes;
for (const string& word : wordlist) {
string wordSorted = word;
sort(wordSorted.begin(), wordSorted.end()); // <= This line break everything
auto index = indexes.find(wordSorted);
if (index == indexes.end()) {
vector<string> vec = { word };
result.push_back(vec);
indexes[wordSorted] = &vec;
} else {
index->second->push_back(word);
}
}
return result;
}
int main()
{
vector<string> wordlist = {"eat", "tea", "tan", "ate", "nat", "bat", "test", "estt"};
auto result = findAnagrams(wordlist);
for (const auto& vec : result) {
for (const auto& word : vec) {
cout << word << " ";
}
cout << endl;
}
return 0;
}
此代碼檢測給定單詞列表中的所有字謎。
正如我的評論所說,當我使用std::sort
對wordSorted
進行排序時,它會破壞所有內容,並且我的代碼以 bad_alloc 結尾。 好像std::sort
在 wordSorted 之外操縱wordSorted
。 如果我刪除這個特定的行,代碼“工作”(結果顯然是錯誤的,但它做了它應該做的)。
怎么可能? 我錯過了什么?
我猜這些行是你的問題的主要原因:
{
vector<string> vec = { word };
result.push_back(vec);
indexes[wordSorted] = &vec;
}
在這里,您將指向局部變量vec
的指針存儲在indexes
map 中。 當塊在}
結束時, vec
的生命周期也結束了,你剛剛存儲的指針將變得無效。
對該指針的任何使用都會導致未定義的行為。
在我看來,解決方案是簡單地不存儲指向向量的指針(指向容器的指針很少需要,如果有的話),而是存儲一個副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.