我有这段代码:
#include <iostream>
#include <list>
int main()
{
typedef std::list<int> list;
int i0t[5]={-1, 2, 3, 3, 5};
list list_1(i0t, i0t+5);
list::reverse_iterator ri0 = ++list_1.rbegin();
list_1.unique();
list_1.remove(3);
int val = *ri0; // why is this valid ?
std::cout << "val = " << val << "\n";
return 0;
}
我的直觉是ri0迭代器在
之后会变得无效
list_1.unique();
list_1.remove(3);
使用MS VS2005调试配置_HAS_ITERATOR_DEBUGGING = 1
但是,我认为“迭代器调试”没有抓住这一点。对吗?
谢谢。
答案 0 :(得分:4)
我的直觉是ri0迭代器会变得无效
是的,它会的。根据§23.3.5.5
void remove(const T&amp; value)
void unique()
[...]仅使迭代器和对已擦除的引用无效 元件。
因此,程序的行为未定义。
答案 1 :(得分:1)
23.3.5.5/15声明对列表执行删除操作的效果只会使迭代器和对已擦除元素的引用无效。它没有指定操作必须使这些迭代器无效。迭代器保持有效是未指定的行为,并不保证在其他实现中发生。 修改后访问迭代器但是未定义的行为。