这条线不能正常工作:
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/