简短问题:以下代码是否使用其他编译器不安全(mingw32),或者它是否有效使用?
list<int> l;
/* add elements */
list<int>::iterator i = l.begin();
i--;
i++;
cout << *i << endl;
...或换句话说:i
被定义为在此之后指向l.begin()
?
答案 0 :(得分:12)
是的,代码不安全。一旦您尝试在begin()
之前移动,就会导致未定义的行为。试图“再次返回”可能行不通。
答案 1 :(得分:2)
std :: list通过链表指针遍历其内容,因此指针算法不用于计算正确的位置。 .begin()的先前位置将没有数据,不应提供任何有效的遍历机制。
像std :: vector这样的容器有随机访问迭代器,并且会在封面下使用指针算法,因此它们可能会给出正确的结果(没问题),但它仍然是个坏主意。
所以,它应该不起作用,它是未定义的,即使它以某种方式起作用也不要这样做:)