3

考虑以下代码:

 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 循环后面可以很容易地修复代码,但在我的示例中,我需要它保留在它之前。但是即使这样,我认为它应该运行良好,谁能向我解释为什么它不能运行?

4

1 回答 1

9

调用 后push_back(),所有迭代器都将失效。来自deque::push_back()

将给定的元素值附加到容器的末尾。 所有迭代器都无效。没有引用无效。

猜想:代码可能正常工作,100而不是1000因为不必重新分配双端队列的内部存储来容纳100导致begin()迭代器保持有效的元素。

于 2012-06-27T10:44:41.487 回答