- 追加された行はこの色です。
- 削除された行はこの色です。
[[Hirofumi Fujii Start Page]]
データ収集や機器制御において、可変長データを扱う需要が多々ある。C++ では、可変長
データを扱うことのできる class が STL としていくつか用意されている。この文書は、
それらを使う際の覚書である。
STL に用意されている、これらの class は container と呼ばれ、
- vector
- dequeue (発音は慣習として "deck" と同じ発音)
- list
の3つがある。
更に、これらの class に対する adapter (container adapter) として
- stack
- queue
- priority_queue
が、
また assosiative container として
- set
- multiset
- map
- multimap
- bitset
が用意されている。
最初の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 がかかる可能性がある。