STL vector

C++からCにポーティング中に気が付いたのだけれども、
今まで、コンストラクタとsize()とcapacity()とresize()とreserve()の挙動を勘違いしてたっぽい。


http://www.wakhok.ac.jp/~sumi/stl/header/vector.html
STLでググルと最初に出てくるのが上のURLなんだけど、
この説明だけだと実際の挙動となんか違うような感じがしたので実際にVC2006で確かめてみた。


STLってコンパイラによっては実装が違う可能性があるのでなんとも言えないけど調べてみた限りではこんな感じ。

  • コンストラク
    • コンストラクタに渡された値は、resizeと同じ挙動になる。
  • capacity
    • vector内部で予約されている領域(要素数)の大きさ
  • resize
    • size()で得られる値を変更する。値を指定した場合はその値でfillされる(小さくなる場合は無視される)大きくなる場合、capacityの拡張が行われる。
  • reserve
    • capacity()で得られる値を変更する。
  • clear
    • size()で得られる値を0に変更する


clearした後はsizeが0になるのは分かってたんだけど、resizeした時の挙動を勘違いしてて
結構やばげな感じになってるのを見つけて冷や汗が出ました。
resizeっててっきりcapacityの拡張がされるだけかと思ってた。


実際にはsizeも拡張されてしまうので、size分ループ回してる様な処理があるとおかしなことになってしまう。
コンストラクタもreserveの挙動だと思ってたらresizeだったし。
コンストラクタの場合はreserveの方が直感的だと思うんだけどどうでしょうか。
つっても今更仕様変更なんて無理だろうねwむむう。


STLで使ってる名前って単純な奴が多すぎて結構間違えて使ってる人も多そうだなと思った。
結構安全に動作してしまうから余計に見逃してしまったりしそう。


もうすこし冗長にするか区別がつきやすい名前にして欲しいなぁ。

sizeって日本語的な感覚だとcapacity的な意味合いがあったりするし。俺だけか?
countとかnumとかの方が分かりやすいと思うんだけど。