36

標準の STL ベクトル コンテナーには、再割り当てを防ぐために後で使用できる初期化されていないメモリを予約する「予約」機能があります。

どうして他の deque コンテナにはそれがないのでしょうか?

4

7 に答える 7

28

のサイズを大きくすると、std::vectorコストがかかる可能性があります。vector予約スペースを超えた場合、ベクターのコンテンツ全体をより大きな予約にコピー(または移動)する必要があります。

これは特に、std::vectorのサイズ変更にはコストがかかる可能性があるためですvector::reserve()。 容量を超えずに一定のサイズに達することを期待reserve()できるように準備できます。std::vector

逆に、aは、既存の要素を再配置することなくdeque、常にメモリを追加できます。記憶ができれば、目立ったメリットはほとんどまたはまったくありませstd::deque reserve()

于 2013-03-20T13:12:17.620 に答える
8

vectorとの場合string、予約済みスペースは、要素をコピー/移動する必要がないことを保証することで、最後 (容量まで) での後の挿入がイテレータと以前の要素への参照を無効にするのを防ぎます。この移転には費用がかかる場合もあります。

dequeと を使用するとlist、最後の挿入によって以前の参照が無効になることはなく、要素は移動されないため、容量を予約する必要はありません。

vectorandを使用するとstring、メモリを割り当てる必要がないため、スペースを確保することで、後で挿入しても (コンストラクターがスローしない限り) 例外がスローされないことが保証されると考えるかもしれません。同じ保証が他のシーケンスにも有用であり、したがって用途があると考えるかもしれませんdeque::reserve実際、 and にはそのような保証vectorありませんstringが、ほとんどの (すべて?) 実装ではそうです。したがって、これは の意図した目的ではありませんreserve

于 2013-03-20T13:28:06.417 に答える
4

C++ リファレンスからの引用

std::vector とは対照的に、deque の要素は連続して格納されません。典型的な実装では、個別に割り当てられた固定サイズの配列のシーケンスを使用します。
両端キューのストレージは、必要に応じて自動的に拡張および縮小されます。両端キューの展開は、既存の要素を新しいメモリ位置にコピーする必要がないため、std::vector の展開よりもコストがかかりません。

Deque は、すべての要素を保持するためにメモリの連続ブロックを必要とするベクトルとは異なり、必要な場所に新しいメモリを割り当てることができ、それを指すだけです。

于 2013-03-20T13:14:51.663 に答える
1

持っているだけvectorです。要素は継続的に保存されないため、dequeの予約機能は必要ありません。また、要素を追加または削除するときに要素を再割り当ておよび移動する必要はありません。

于 2013-03-20T13:12:08.813 に答える
0

予約は、連続するデータの大きなブロック(ベクトルなど)の割り当てを意味します。デキューには、連続したストレージを意味するものは何もありません。通常、リストのように実装されます(これには、「予約」機能もありません)。

したがって、「予約」関数は意味がありません。

于 2013-03-20T13:13:55.657 に答える
0

メモリには主に 2 つのタイプがあります。配列やベクトルのように 1 つのチャンクを割り当てるメモリと、メンバーが空の場所を取得して埋める分散メモリです。特定の要素を削除しても、配列やベクトルとは対照的に、大量のメモリの移動は発生しません。したがって、事前にスペースを予約する必要はありません。必要な場合は、チップに接続するだけです。

于 2013-03-20T14:34:12.667 に答える
0

メモリ コンテナーを整列させることを目的としている場合は、次のような実装を考えることができます。

std::deque<std::vector> dv; //deque with dynamic size memory aligned vectors.

typedef size_t[N] Mem;
std::deque<Mem> dvf //deque with fixed size memory aligned vectors. Here you can store the raw bytes adding a header to loop through and cast using header information and typeid... 
//templates and polymorphism can help storing raw bytes, checking the type where a pointer points for example, and creating an interface to access the partial aligned memory.

または、deque の代わりにマップを使用してベクトルにアクセスすることもできます...

于 2021-03-17T11:30:18.893 に答える