【发布时间】:2019-01-15 13:40:54
【问题描述】:
我已阅读 this SO post 和 this one too 关于
在迭代期间从std::set 中删除元素。
但是,C++17 中似乎存在更简单的解决方案:
#include <set>
#include <iostream>
int main(int argc,char **argv)
{
std::set<int> s;
s.insert(4);
s.insert(300);
s.insert(25);
s.insert(-8);
for (auto it:s)
{
if (it == -8)
{
s.erase(it);
}
}
std::cout << "s = {";
for (auto it:s)
{
std::cout << it << " ";
}
std::cout << "}\n";
return 0;
}
当我编译并运行它时,一切都很完美:
$ g++ -o main main.cpp
$ ./main
s = {4 25 300 }
在擦除这样的元素时有什么注意事项吗?谢谢。
【问题讨论】:
-
您正在按键擦除,因此您也可以调用
s.erase(-8)并完成它。第一个 for 循环毫无意义。 -
我认为它从 C++11 开始有效。
-
@WhozCraig 这只是一个 POC 示例...... if (it ==-8) 部分只是选择一些任意元素进行删除的示例。
-
好的,你的 real 问题是否在 C++17 中有效的
std::set上的 ranged-for 枚举期间使用容器修改?一旦std::set::erase实际上开始返回一个,这个问题在 C++11 中使用迭代器解决了,但是你想知道它是否也支持 ranged-for ?我不认为是。 -
对 C++ 的最大警告是“一切都很完美”并不意味着没有未定义的行为。 (正如 Dijkstra 所说,测试只能显示错误的存在,而不是它们的缺失。)