Hirofumi Fujii Start Page

データ収集や機器制御において、可変長データを扱う需要が多々ある。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 がかかる可能性がある。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS