今、ジョスティスのSTLの本を読んでいます。
私の知る限り、c++ vector は再割り当て可能な c-array です。それで、 push_back() の後にすべてのイテレータと参照が無効になる理由を理解しています。
しかし、私の質問は std::deque に関するものです。私が知っているように、それは大きなブロックの配列です(c配列のc配列)。したがって、push_front() は最初に要素を挿入し、スペースがない場合、deque は新しいブロックを割り当て、割り当てられたブロックの最後に要素を配置します。
真ん中の insert() の後、すべての参照とイテレータが無効になり、その理由がわかりました - すべての要素が移動されます。しかし、「... push_back() および push_front() の後、すべての参照は有効なままですが、イテレータはそうではありません」というフレーズを本当に誤解しています (同じフレーズは @ standard:23.2.2.3 で見つかります)。
どういう意味ですか?!参照が有効な場合、deque はその要素を再割り当て (== 移動) できませんでした。では、なぜ反復子が無効になるのでしょうか? 非移動要素の挿入後にそれらを使用できないのはなぜですか? それとも、begin() または end() とオーバーフローに対するイテレータの等価性について確信が持てないということですか?
また、ererase() の後、すべてのイテレータと参照が有効なままであることにも言及したいと思います (消去されたものを除く:-))。
PS: 「標準」形式で回答しないでください: 「標準でそう言っているので使用できません」。なぜ、何が起こるのかを理解したい。