std::vectorの仕様

多分こんな感じ。(ソースを読んだ事はない)

  • インスタンスを作ると自動的にある程度のメモリ領域を確保する。
  • reserveで領域の広さを変更可能。(別の位置にメモリ再確保)
  • push_backで現在ある要素の最後に新たな要素を追加。その際、追加後の配列が確保されている領域より大きくなったら領域を別の位置に再確保する。
  • eraseで所定位置の要素を削除する。vectorは全ての要素が連続になっていないといけないので、その要素より後ろの要素全てを一つ前に詰める

そして

  • 再確保したメモリ領域にデータを移す時や、eraseを使った時はそれぞれの要素をコピーする。
  • よってvectorコンテナの中身がでっかい構造体やクラスだったりするとコピーに時間がかかる。
  • コピーコンストラクタも実行されるので、とんでもないことになりえる。
  • なのでvectorには生の実体ではなくポインタを入れましょう。という話。

そこから導き出される仕様が

  • ランダムアクセスは早い(わざわざメモリ上で連続した配列にするので)。
  • pushやeraseは遅い(大量のデータコピーが起きる可能性があるため)。
  • 直接構造体やクラスの実体を入れてはいけない。
  • auto_ptrのようなコピー禁止のスマートポインタは使えない(コピーするので)。

ということである。多分。