C++ std :: set :: erase不起作用

Ric*_*rei 1 c++ stl

我有以下几个变量:

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;
Run Code Online (Sandbox Code Playgroud)

我尝试使用此函数从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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有收到所需的输出,我可能做错了什么?

Sam*_*hik 5

for (auto jt : NFA[i]) {
  jt.second.erase(x);
Run Code Online (Sandbox Code Playgroud)

此处的范围迭代按值迭代.您需要通过引用迭代:

for (auto &jt : NFA[i]) {
  jt.second.erase(x);
Run Code Online (Sandbox Code Playgroud)

您的原始范围迭代在逻辑上等同于以下(实际上并不完全相同,但细节差异与此问题的目的无关):

for (auto b=NFA[i].begin(); b != NFA[i].end(); ++b)
{
    auto jt=*b;

    jt.erase(x);
}
Run Code Online (Sandbox Code Playgroud)

所以你最终会删除实际副本中的值std::set.不是一个有用的结果.

您需要使您的范围迭代使用引用,以便您的范围迭代在逻辑上等效于:

auto &jt=*b;
Run Code Online (Sandbox Code Playgroud)