2012-06-27 39 views
3

考慮下面的代碼:奇怪的運行時錯誤當過的std :: deque的

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)時,代碼正常工作。

通過在第一個for循環後面移動start定義(第4行),可以很容易地修復代碼,但在我的示例中,我需要將它留在它之前。但即使這樣,我認爲它應該運行良好,任何人都可以向我解釋爲什麼它不?

回答

9

在致電push_back()之後,所有迭代器均失效。從deque::push_back()

將給定的元素值追加到容器的末尾。 所有迭代器失效。沒有引用是無效的。

:該代碼可能正常工作與100而不是1000作爲雙端隊列的內部存儲沒有被重新分配,以適應導致begin()迭代剩餘的有效的100元素。

+2

如果你確實真的希望你的迭代器保持有效,你應該考慮使用其他容器更友好的迭代器語義。在這方面,'std :: list'或多或少是替代'std :: deque'的替代品。 – Rook