>> C++入門トップに戻る

コンテナ【vector】

まずは、コンテナのvectorから説明します。
vectorを利用するには、vectorというヘッダファイルをインクルードする必要があります。
また、stdという名前空間に属しています。
まず下記のコードを見てください。

#include <vector>

using namespace std;

void func(vector<int>::iterator begin,vector<int>::iterator end){

	for(;begin!=end;++begin){
		printf("%d,",*begin);
	}

	//改行
	printf("\n");
}

int main(void)
{
	//vector型のコンテナ宣言
	vector<int> test;

	//vector型のイテレーターを宣言
	vector<int>::iterator begin,end;

	//リストの末尾に10を追加。
	test.push_back(10);

	//添字でもアクセス可能
	printf("%d\n",test[0]);

	//末尾に20を追加。
	test.push_back(20);

	//先頭のイテレータを代入
	begin=test.begin();
	//末尾のイテレータを代入(最後の要素の次の要素を指している)
	end=test.end();

	//現在リストに入ってる値を全て表示。
	func(begin,end);

	//末尾の要素を消す
	test.pop_back();

	//先頭のイテレータを代入
	begin=test.begin();
	//末尾のイテレータを代入(最後の要素の次の要素を指している)
	end=test.end();
	//リストの値を全て表示
	func(begin,end);
	
	return 0;
}

これを実行すると、こうなります。


ではかなり長いですが、解説していきます。
main関数内でまずvectorのコンテナとそのイテレーターを宣言しています。
イテレーターとは、コンテナ内の要素がどの位置を指しているかを示すポインタのようなものです。
それぞれの書き方は、

//コンテナ
vector<コンテナの型> コンテナ名(必要ならばコンストラクタ引数指定)
//イテレーター
vector<コンテナの型>::iterator イテレーター名

です。
コンテナの型というところに、これから作るリストの型を指定します。
intと指定したら、そのコンテナはint型しか扱えません

次にコンテナ名の後ろには、コンストラクタの引数を指定できます。
第一引数に要素数を、第二引数にその値を指定します。
省略した場合は、要素数ゼロで作られます。

イテレーターの宣言に関しては書いてある通りですが、
::iteratorと書いてる部分は種類が三つあって、

・iterator
・reverse_iterator
・const_iterator

があります。
各要素にはこのイテレーターを使ってアクセスします。
例えば、要素が5つあるコンテナがあるとします。
今イテレーターの指している位置が先頭の要素だとすると、
次の要素の位置にイテレーターを移動させるには、

++begin;

と書きます。これで二つ目の要素の位置にイテレータがあることになります。
これが通常のiteratorを使った場合の動作なのですが、
reverse_iteratorを使うと、
++begin;
と書いても今指している位置の前の要素の位置にイテレータが移動します。
例えば、現在のイテレータの場所が要素3を指しているとしたら、
++beginとした場合は、イテレータが要素2の位置に移動します。
++と足しているのに、イテレータの位置が戻ることに注意して下さい。

ちなみにiteratorはその要素の位置をさしているだけのポインタのようなものです。
その要素の実際の値を書き換えるには、
ポインタと同じように前にアスタリスク(*)をつけます。
これでその要素にアクセスすることが出来、書き換えや読み込みができます。

もし、const_iteratorを指定してイテレーターを作った場合は、
書き換えが出来なくなり、読み込みだけになります。

ちなみに、iteratorを指定して、
イテレーターを作ったとしても、

--begin;

と書けば、前の要素にイテレータを移動させることができます。

これでコンテナの作成とイテレータの作成は理解できましたでしょうか?
次にそれぞれの関数について説明していきます。

まず最初の、push_back関数からです。
この関数に値を指定すると、その値をコンテナの末尾に追加してくれます。
今回のコードでは、コンストラクタに何も指定せずにコンテナを作ったので、
この関数を実行した時点では、コンテナの中にはこの10の値が入った要素一つしかありません。

次の行に行って、添字を使って要素にアクセスして値を表示しています。
vectorはこのように添字を使って要素にアクセスすることが可能です。
ですが、今後説明する別のSTLでは添字が使えないものもありますのでご注意下さい。


次の行で、また末尾に20をセットしています。
この時点で、10→20という順番で要素がセットされていることになります。
その後に、begin関数と、end関数を使っています。
これは、コンテナ内の最初の要素のイテレーターと最後の次の要素のイテレータを返します。
end関数は最後の要素の「次の」要素のイテレーターを返します。注意して下さい。

で、次にそのイテレータを使って、コンテナ内部の要素の値を全て表示しています。
func関数というのを作って、第一引数と第二引数にイテレータが来るように設定しています。
このようにイテレータも型に設定して、関数として利用することが可能です。
func関数ないで、forループ文が行われていますが、
begin!=endのところが味噌です。
beginには最初の要素を指すイテレータが、endには最後の要素の次を指すイテレータが入っています。
forループで++beginとしているので、1ループごとにイテレータが段々末尾に移動していきます。
endが最後の次の要素を指しているので、beginが足されていって、最後の次の要素までイテレータが移動したとき、
beginとendはイコールの関係になるので、begin!=endの条件に反しますよね?
つまり、最初から最後の要素まで表示して、ループを抜けられるというわけなんです。
これがfunc関数の仕組みです。
イテレータを使うときはこういう関数を作っておいたほうが色々と便利です。

次に、pop_back関数を使っています。
これは、コンテナの末尾の要素を消す関数です。
実行した後に消えてるのが分かりますよね?

以上で、今回のコード内にある関数の説明は全てです。
ですが、もっと沢山の関数が備わっていますので、ざっと紹介しておきます。

assign() 要素を割り当てる
at() 指定した位置の要素のイテレータを返す
back() 最後の要素のイテレータを返す
clear() 全ての要素を削除する
empty() コンテナが空かどうかを判定、空なら真
erase() 要素を削除する(引数には削除したい位置のイテレータを指定)
front() 先頭要素のイテレータを返す
insert() 要素を挿入(第一引数に挿入したい位置のイテレータ、第二引数に値)
max_size() 保持できる最大要素数を返す
rbegin() 末尾を指すリバースイテレーターを返す
rend() 先頭を指すリバースイテレーターを返す
resize() 要素数を変更する
size() 要素数を返す
swap() 二つの要素を入れ替える

主要なものを挙げましたが、まだ沢山有ります。
使い方一つ一つ紹介してると日が暮れてしまうので、あえて紹介はしませんが、
試しに使ってみると案外簡単に使えますので、是非試しに色々といじってみてください。

今回の説明は以上です。
次回はlistコンテナについて説明します。


>> 【コンテナ【list】】に進む
>> C++入門トップに戻る