C++ std::set::擦除不起作用
C++ std::set::erase doesn't work
我有以下变量:
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;
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- C++矢量 - 放置/擦除不起作用?(多态性)
- 擦除() 不起作用C++
- C++ std::set::擦除不起作用
- 如何通过长度从 std::vector 中删除元素<string>(擦除不起作用)
- 模板类矢量擦除不起作用
- 标准::列表::擦除不起作用
- STL 矢量擦除不起作用
- 对象的 C++ 向量,包含动态分配的内存 - "擦除"不起作用
- 矢量擦除函数不起作用 c++
- 排序、唯一、擦除不起作用
- 矢量排序和擦除不起作用
- C++映射擦除(开始,结束)不起作用
- 如何删除矢量中的元素。(擦除不起作用)
- 矢量上的擦除操作不起作用
- 迭代器擦除 (迭代器在先,迭代器最后) 在 Visual C++ 2010 Express 下不起作用
- 向量::擦除在类方法中不起作用,但在 main 中工作;没有编译器错误,只有意外的结果