【发布时间】:2019-05-01 10:43:06
【问题描述】:
这行不正常:
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;
}
}
}
【问题讨论】:
-
修改
std::vector会使该向量中的所有迭代器无效。因此,您不能在通过基于范围的 for 循环(它只是映射到从.begin()到.end()的普通 for 循环)对其进行迭代时修改nonterminals_。productions_[nonterminal]也是如此,它也是一个向量。你到底想在这里实现什么?这看起来应该以更易读的形式完全重写...... -
具体应该根据什么逻辑删除和添加元素?