コンテナとは一言で行ってしまえば便利な入れ物です。通常、複数の変数を保持しておきたい場合には配列を使いますが配列は事前に格納できる数が決まっているため格納する個数に変動がある場合には扱いづらいというデメリットがあります。そこでC++ではSTL(Standard Template Library)という可変長配列が標準で提供されています。まずはどのようなものがあるかを紹介します。
そして今回は代表としてこの中で使用頻度の高いコンテナであるvector
について紹介してます。
vectorは動的配列テンプレートクラスで簡単に行ってしまえば様々な型を指定でき、さらに格納数に応じて自動的にサイズが大きくなっていくものという認識でいいと思います。使い方についてはこのようになります。
#include <iostream> //vectorを使用するため #include <vector> //vectorはstdに所属しているため using namespace std; void main(){ //int型の可変長配列を初期サイズ10で宣言 vector<int> vec(10); //要素にアクセスするためのイテレーターを宣言 vector<int>::iterator begin,end; //イテレータの初期化 begin=vec.begin(); end=vec.end(); //サイズ取得 vec.size(); //末尾に追加 vec.push_back(3); //要素参照 vec.at(0); //末尾取り出し vec.pop_back(); //サイズ変更 vec.resize(100); //選択削除 vec.erase(1); //全て削除 vec.clear(); //全ての要素を足す int sum=0; while( begin != end ) { sum += *begin; begin++; } }
このように基本操作はvectorだけで行えますが要素の参照や変更、高度な操作はイテレータという専用のアクセスするものが用意されています。
基本的にはvectorと同じ宣言に::iteratorを加え、初期化としてvectorの先頭と末尾を指すようにします。操作内容はシンプルです。
なんでいちいちこんなめんどくさい方法で!と最初は思いますがイテレータを使うことにより安全・高速かつ範囲指定をしての高度な操作が可能になるため慣れるまでは頑張りましょう。ここでは紹介しませんがSTLに対しての高度な操作を簡単に提供してくれるalgorithmヘッダが標準であるので興味のある方は調べてみるのもいいと思います。
それを知った上でですが、実はコンテナはイテレータだけのアクセスだけでなく配列のようにアクセスをすることもできます。
int num; num=vec[0]; num=*begin;
イテレータ(begin)がvecの最初の要素を指している時、この2行はまったく同じ結果になります。自身の使用方法に合わせて使い分けるのがベストかと思います。