迭代std :: deque时出现奇怪的运行时错误

Luk*_*sen 3 c++ iterator stl runtime-error

考虑以下代码:

 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;
Run Code Online (Sandbox Code Playgroud)

在执行它时,我总是在第10行遇到运行时错误(实例:http://ideone.com/juQAA).但是,当我更改第6行for (int i = 0; i != 100; ++i)代码工作正常.

通过start在第一个for循环后面移动定义(第4行)可以很容易地修复代码,但在我的例子中,我需要它保持在它之前.然而,即使这样,我认为它应该运行良好,任何人都可以解释为什么它没有?

hmj*_*mjd 9

调用之后push_back(),所有迭代器都会失效.来自deque::push_back():

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

猜测:代码可能正常工作,100而不是1000因为deque的内部存储不必重新分配以容纳100导致begin()迭代器保持有效的元素.

  • 如果你真的,真的希望你的迭代器保持有效,你应该考虑使用具有更友好的迭代器语义的其他容器.在这方面,`std :: list`或多或少是`std :: deque`的替代品. (2认同)