C++ std::set::擦除不起作用

C++ std::set::erase doesn't work

本文关键字:不起作用 擦除 set C++ std      更新时间:2023-10-16

我有以下变量:

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;