我有以下变量:
vector< unordered_map< char, set<int> > > LNFA, NFA;
vector< set<int> > L_enclosure;
set<char> characters;
int nr_states;
set<int> acceptance_states, NFA_accept;
我尝试使用此功能从NFA变量的std::set中删除某个数字。但是,如果我在其中打印内容,它甚至会显示我要删除的项目。这些变量是全局声明的。
这是功能:
void remove_state(int x) {
for (int i = 0; i < nr_states; ++i) {
for (auto jt : NFA[i]) {
jt.second.erase(x);
}
}
}
我没有收到所需的输出,我可能做错了什么?
最佳答案
for (auto jt : NFA[i]) {
jt.second.erase(x);
范围迭代在此处按值迭代。您需要通过引用进行迭代:
for (auto &jt : NFA[i]) {
jt.second.erase(x);
您的原始范围迭代在逻辑上等效于以下内容(实际上并不完全相同,但是细节差异与该问题的目的无关):
for (auto b=NFA[i].begin(); b != NFA[i].end(); ++b)
{
auto jt=*b;
jt.erase(x);
}
因此,您最终从实际
std::set
的副本中删除了该值。不是有用的结果。您需要使范围迭代使用引用,以便您的范围迭代在逻辑上等同于:
auto &jt=*b;