ムーブ コンストラクターの C++11 標準要件は次のstd::vector
とおりです (表 99 — アロケーター対応コンテナーの要件)。
X(rv)
X u(rv)
- アロケータのムーブ構築は、例外によって終了してはならない
- post:
rv
この構築前と同じ要素を持つ必要があります。の値は、この構築前get_allocator()
の の値と同じでなければなりません。rv.get_allocator()
- 複雑さ: 定数
容量に関する要件/保証はありません。しかし、一定の複雑さは再割り当てを暗黙のうちに否定するという結論を下すことができます。また、再割り当て以外に容量を変更する論理的な理由は見当たりません。だから同じだろう。
別の観点からは、移動元のベクトルが空の場合、それを無視してそれ自体をデフォルトで構築することは完全に合法です。これは、要素ごとの構成を必要としないため、O(1) のままです。(この問題についてニコル・ボーラスに感謝します)。
また、実装により、関数hint
のパラメーターを使用して容量をサイズに縮小できる可能性があります。std::allocator::allocate
pointer allocate(size_type, allocator<void>::const_pointer hint = 0);
の使用hint
は指定されていませんが、実装が必要な場合に局所性を支援することを目的としています。したがって、一部の洗練されたソリューションでは、ベクトルストレージポインターを渡して、それをhint
使用realloc
して容量を縮小する可能性があります。
結論:標準では、移動時に容量を維持することは保証されていないようstd::vector
です。ストレージが縮小される可能性があります。