c++ - 当我添加一个新元素时,Unordered_map 表现得很奇怪

标签 c++ c++11 stl

这条线不能正常工作:

for (auto prod : productions_[*productionNonterm])
                productions_[nonterminal].push_back(prod);

如果 productions_[*productionNonterm] 只有 1 个元素,一切都很好。但如果它至少有 2 个元素,productionNonterm 会被修改,我不知道为什么。

vector<string> nonterminals_;
unordered_map<string, vector<string>> productions_;

for (const auto &nonterminal : nonterminals_) {
    for (auto productionNonterm = productions_[nonterminal].begin(); productionNonterm != productions_[nonterminal].end(); ++productionNonterm) {
        if (cntNonterminalsInProduction(*productionNonterm) == 1 && cntTerminalsInProduction(*productionNonterm) == 0) {
            nonterminals_.erase(find(nonterminals_.begin(), nonterminals_.end(), *productionNonterm));

            for (auto prod : productions_[*productionNonterm])
                productions_[nonterminal].push_back(prod);

            productions_[*productionNonterm].erase(productions_[*productionNonterm].begin(), productions_[*productionNonterm].end());

            productions_[nonterminal].erase(productionNonterm);
            --productionNonterm;

        }
    }
}

最佳答案

迭代器 productionNonterm 的问题,它在循环期间变得无效:

一旦你开始你的循环

    for (auto prod : productions_[*productionNonterm])
        productions_[nonterminal].push_back(prod);

您将使用指向 productions_[nonterminal] 中的一个(第一个)元素的有效迭代器 (productionNonterm)。

但是在循环的主体第一次执行后 - vector productions_[nonterminal] 将重新分配其元素(由于增长)并且您的指针(迭代器)将失效...

关于c++ - 当我添加一个新元素时,Unordered_map 表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934965/

相关文章:

python - 使用某些 OpenCV 函数时出现段错误

C++ std::list:迭代时删除/删除元素

c++ - C++中 vector 的初始容量

c++ - 纯虚函数可以作为Variadic函数模板吗?

c++ - 如何搜索所有可能的单词加字母组合?

c++ - 通过参数启用时 std::enabled_if 如何工作

c++ - 如何调用函数指针数组中的函数?

C++ 11 正则表达式未按预期返回组

c++ - 为什么在使用嵌套的 OpenMP pragma 时 c++11 线程变得不可连接?

c++ - 有效地从缓冲区读取值