1
154
这取决于实现: 标准23.1.2.8:
也许你可以试试这个——这是符合标准的:
请注意,它++是后缀,因此它将旧位置传递给擦除,但由于运算符的原因,它首先跳转到新位置。
2015.10.27更新:
C++ 11解决了缺陷。
|
2
18
如果你通过valgrind运行你的程序,你会看到一堆读取错误。换句话说,是的,迭代器是无效的,但是您在示例中很幸运(或者很不幸,因为您没有看到未定义行为的负面影响)。解决方法之一是创建临时迭代器、增加临时迭代器、删除目标迭代器,然后将目标设置为临时迭代器。例如,按如下方式重新编写循环:
|
3
6
你误解了“未定义行为”的含义。未定义的行为并不意味着“如果你这样做,你的程序 将 崩溃或产生意想不到的结果。“这意味着”如果你这样做,你的程序 能够 崩溃或者产生意想不到的结果”,或者做任何其他事情,这取决于你的编译器、你的操作系统、月亮的相位等等。 如果某个东西执行时没有崩溃,并且行为如您所期望的那样,那就是 不 证明它不是未定义的行为。它所证明的是,它的行为恰好与在特定操作系统上使用特定编译器编译后的特定运行所观察到的一样。 从集合中删除元素会使迭代器对已删除元素无效。使用无效的迭代器是未定义的行为。碰巧观察到的行为正是您在这个特定实例中的意图;这并不意味着代码是正确的。 |
4
2
警告一下,对于deque容器,检查deque迭代器是否与numbers.end()相等的所有解决方案都可能在GCC4.8.4上失败。也就是说,删除deque元素通常会使指向数字的指针失效。end():
输出:
请注意,虽然deque转换在这种特殊情况下是正确的,但是结束指针已经失效。由于尺寸不同,误差更明显:
输出:
以下是解决此问题的方法之一:
|
5
1
这种行为是特定于实现的。为了保证迭代器的正确性,如果需要删除元素,则应使用“it=numbers.erase(it);”语句,而在其他情况下,只需使用increment迭代器。 |
6
0
我遇到了同样的老问题,发现下面的代码更多 可以理解的 这在某种程度上符合上述解决方案。
|
7
0
我想用stl方法
此解决方案可能效率较低。 假设我们有某种容器,比如向量或一个名为m_项目符号的列表:
’
’
|
8
0
C++ 20将具有“统一容器擦除”,您将能够编写:
这对
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |