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)コードに変更すると、正常に動作します。

このコードは、定義 (4 行目) を最初の for ループの後ろに移動することで簡単に修正できますstartが、私の例では、その前に留まる必要があります。しかし、このようにしても問題なく動作するはずだと思いますが、なぜうまくいかないのか説明してもらえますか?

4

1 に答える 1

9

を呼び出した後push_back()、すべての反復子が無効になります。からdeque::push_back():

指定された要素の値をコンテナーの末尾に追加します。 すべての反復子が無効になります。参照は無効になりません。

推測: コードはおそらく正常に動作しますが、要素を収容するために両端キューの内部ストレージを再割り当てする必要がなかったため100、イテレータは有効なままでした。1000100begin()

于 2012-06-27T10:44:41.487 に答える