火曜日, 2月 05, 2008

C++解説9(vector)

今回はSTL(Standard Template Library)を使用します。
最初は一番馴染み易いものが良いのでvectorという
シーケンスコンテナを扱ってみます。

「vector(べクター)」とは可変長配列を指します。
簡単に言えば、配列を宣言する上で必要だった
要素数のMAXを指定する事なく
いくらでも要素を追加する事を可能にした配列です。

・最大の特徴はランダムアクセスが可能である
・末尾へのデータ追加、削除については「O(1)」を出す。
・C言語の配列と同様の考え方ができる

特徴としてはこんなところでしょうか?
では実際にvectorを使ってみましょう。

// 「vector」の宣言
vector v;

// 要素の代入
for(int i=0; i != 10; i++) {
v.push_back(i);
}

// 要素数の出力
cout << v.size() << endl;

// 末尾への要素削除
v.pop_back();

// 末尾への要素追加(配列のMAXは気にする必要なし)
v.push_back(100);

// 要素参照
for(unsigned u=0; u != v.size(); ++u) {
cout << v[u] << ",";
}

上の機能をC言語で実現した場合の違いを書かなくては
何が凄いかは分かりづらいかもしれないですね。

まず、要素数を抑えるために別の変数を用意する必要があります。

int v[10];
unsigned size=0;

// 要素の代入
for(; size != 10; size++) {
v[size]=size;
}

// 要素数の出力
cout << size << endl;

// 末尾への要素削除
size--;

// 末尾への要素追加(配列のMAXは気にする必要なし)
size++;
if (size < 11) {
v[size]=100;
} else {
cout << "要素数オーバー" << endl;
return -1;
}

// 要素参照
for(unsigned u=0; u != size; ++u) {
cout << v[u] << ",";
}
return 0;
}

こんな感じになります。
あんまり凄さは分かんないですかね?

size++;
if (size < 11) {
v[size]=100;
} else {
cout << "要素数オーバー" << endl;
return -1;
}

いろんな意味で、この部分が必要なくなるって事が
もの凄い事なんですよね。

「vector」とは一つのオブジェクトですので
様々な情報も保持しています。

配列の情報として一番重要なのは要素数という事になります。
それも別の変数で管理する必要はなく
「v.size()」と記述する事で情報の取得が行えます。
ここがオブジェクトの素晴らしいところです。

さらに「vector」には数々のアルゴリズムが用意されています。
配列を扱う上でメンドクサイ作業の一つに
配列の途中に要素を挿入する、又は途中の要素を削除すると
いった作業がありました。
純粋にアルゴリズムと言われるプログラムを書いていたと思いますが
「vector」にはこの辺りも汎用プログラムとして既に存在します。

v.clear();
と記述するだけで、配列内の全ての要素が削除されます。
この作業を行う方法はいろいろとあったと思います。
外部で管理している要素数に「0」を代入する
といった作業と同じ感じです。

シーケンシャルなコンテナである配列への要素追加は
末尾に追加されるのが一般的です。
例にも出てきましたが

v.push_back(val);
は要素の追加を行います。

a[配列要素数のMAXを管理している変数]=val;
配列要素数のMAXを管理している変数++;

こんな感じの処理を行っています。

逆に要素を取り出しするのが
v.pop_back();

配列要素数のMAXを管理している変数--;
ってところでしょうか。

イテレータという考え方を覚えると、
このコンテナに実装されているアルゴリズムが
さらに沢山ある事が分かります。

次回はイテレータという考え方に触れて
この「vector」の続きを少し書きたいと思います。

0 件のコメント: