考虑以下代码:
1 typedef std::deque<int> mydeque_t;
2 mydeque_t mydeque;
3
4 mydeque_t::iterator start = mydeque.begin();
5
6 for (int i = 0; i != 1000; ++i)
7 mydeque.push_back(i);
8
9 for (mydeque_t::iterator myint = start; myint != mydeque.end(); ++myint)
10 *myint += 1;
执行它时,我总是在第10行遇到运行时错误(实例:http://ideone.com/juQAA)。但是当我将第6行更改为for (int i = 0; i != 100; ++i)
时,代码工作正常。
通过将start
定义(第4行)移到第一个for循环后面,可以轻松修复代码,但在我的示例中,我需要它保持在它之前。然而,即便像这样,我认为它应该运行良好,任何人都可以解释为什么它没有?
答案 0 :(得分:9)
调用push_back()
后,所有迭代器都无效。来自deque::push_back()
:
将给定元素值追加到容器的末尾。 所有迭代器都无效。没有引用无效。
猜猜:代码可能适用于100
而不是1000
,因为deque的内部存储不必重新分配以容纳{{1}导致100
迭代器保持有效的元素。