データ収集や機器制御において、可変長データを扱う需要が多々ある。C++ では、可変長 データを扱うことのできる class が STL としていくつか用意されている。この文書は、 それらを使う際の覚書である。
STL に用意されている、これらの class は container と呼ばれ、
更に、これらの class に対する adapter (container adapter) として
最初の3つは、同一 type の object を線形に並べて格納するもので、 その意味では同じ機能を果たす。しかし、要素の追加・削除・access に 対する制約や効率が異なる。
vector は C の配列と互換性を持つ。先頭要素の address は C の配列の先頭要素として扱うことができる。
double rbuf[5];
int result;
:
result = myfunc(rbuf, 5);
という C のコードは(myfunc の宣言を extern "C" で囲むなどの処理を した上で)
std::vector<double> rbuf(5);
int result;
:
result = myfunc(&*rbuf.begin(), 5);
という C++ のコードに焼き直すことが可能である。一方、program 上、 注意すべきは(C で見て連続配列に見えるように実装する関係で)要素の 追加など、size が増加するような操作の後では、その前に取得した iterator が 無効になる可能性があることで、要素の access には index を用いるのが 安全である。また、効率的観点からは、確保してある size を越えて 大きくなる場合に、現在より大きな size の記憶域を確保し、現在の内容を copy して前の記憶域を解放するという操作が入るために、大きくなってからの 要素の追加には多大な memory 操作 cost がかかる可能性がある。