基本的に、 avector
は、その容量 (割り当てられたメモリの合計) とサイズ (実際に使用される要素) と共に、配列への単なるポインタです。
struct vector {
Item* elements;
size_t capacity;
size_t size;
};
もちろん、カプセル化のおかげで、これらすべてがうまく隠され、ユーザーは面倒な詳細 (再割り当て、必要に応じてコンストラクター/デストラクタを呼び出すなど) を直接処理することはありません。
クリアに関するパフォーマンスの問題については、ベクトルをクリアする方法によって異なります。
- 一時的な空のベクトル (通常のイディオム) と交換すると、古い配列が削除されます。
std::vector<int>().swap(myVector);
clear()
またはを使用resize(0)
すると、すべてのアイテムが消去され、割り当てられたメモリと容量は変更されません。
効率が気になる場合、考慮すべき主なポイントはreserve()
、配列を事前に割り当て、無駄な再割り当てとコピー (または C++ 11 での移動) を回避するために (可能であれば) 事前に呼び出すことです。ベクトルに多くの項目を追加すると、大きな違いが生じる可能性があります (ご存知のように、動的割り当ては非常にコストがかかるため、削減するとパフォーマンスが大幅に向上します)。
これについてはまだまだ言いたいことがたくさんありますが、基本的な詳細を説明したと思います。特定の点についてさらに情報が必要な場合は、遠慮なくお尋ねください。
マップに関しては、通常、赤黒木を使用して実装されます。ただし、標準はこれを義務付けていません。機能と複雑さの要件のみを示しているため、法案に適合する他のデータ構造は問題ありません。RB ツリーがどのように実装されているかはわかりませんが、マップには少なくともポインターとサイズが含まれていると思います。
そしてもちろん、すべてのコンテナー タイプは異なります (たとえば、順序付けられていないマップは通常、ハッシュ テーブルです)。