1

http://www.cppreference.com/wiki/stl/deque/insertを参照として使用して、特定の場所で両端キューに値を挿入していました。

たとえば、deque A が次の場合:

a, b, d, e, g

d を指すイテレータを使用すると、次のことができます。

A.insert(iter, c);    // insert val c before loc iter
//deque is now    a, b, c, d, e, g

iter はまだ d を指しています。ただし、 iter が g を指す場合、最後の要素:

A.insert(iter, f);
//deque is now    a, b, c, d, e, f, g

しかし iter は f を指すようになりました!!

私の現在の回避策は次のとおりです。

iter = A.insert(loc, val);  // point iterator to element that was inserted before loc
iter++;                     // point iter back to loc

私はこれをもう一度テストしたことはありません。バグを追跡するのに非常に多くの時間を費やして、すべての場所のstlでinsert()の一貫性のない動作を発見するのは面倒でした。

最後に、他の場所と比較して、insert() の動作が異なるのはなぜですか? それとも私が何か間違ったことをしたのですか?

4

1 に答える 1

7

挿入を実行すると、既存のすべてのイテレータが無効になるため、古いイテレータを再利用すると、予期しない動作(クラッシュの可能性があります)が発生します。

回避策は正しい解決策です。

編集:2番目の質問に関して、。の後に中括弧がありませんif (*iter == 'g')。将来的には、新しい質問を新しい投稿に入れてください。

于 2009-12-29T01:09:51.107 に答える