簡體   English   中英

我不明白為什么我對字符串的排序會破壞一切

[英]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::sortwordSorted進行排序時,它會破壞所有內容,並且我的代碼以 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM