std :: list<>:l.begin()之前的元素

时间:2011-08-31 21:53:05

标签: c++ list

简短问题:以下代码是否使用其他编译器不安全(mingw32),或者它是否有效使用?

list<int> l;
/* add elements */
list<int>::iterator i = l.begin();
i--;
i++;
cout << *i << endl;

...或换句话说:i被定义为在此之后指向l.begin()

2 个答案:

答案 0 :(得分:12)

是的,代码不安全。一旦您尝试在begin()之前移动,就会导致未定义的行为。试图“再次返回”可能行不通。

答案 1 :(得分:2)

std :: list通过链表指针遍历其内容,因此指针算法不用于计算正确的位置。 .begin()的先前位置将没有数据,不应提供任何有效的遍历机制。

像std :: vector这样的容器有随机访问迭代器,并且会在封面下使用指针算法,因此它们可能会给出正确的结果(没问题),但它仍然是个坏主意。

所以,它应该不起作用,它是未定义的,即使它以某种方式起作用也不要这样做:)