第5章 コンテナ

 今回はSTLの中でも一番有名なのではと思われるコンテナについて話します。STLは実はアルゴリズムが中心のライブラリなのですが...。


 では、今回の要点です。


 では、いってみましょう。


 さて、第2部第37章で CArray という動的配列クラステンプレートを作りました。しかし、このクラステンプレートは途中でサイズが変えられないなど不便な点も多いものでした。

 第37章であまり凝って作らなかった理由にはもちろん長くなってしまうからというのもあったのですが、もう1つ理由がありました。それは、既にSTLにそういうクラスが用意されているからなのです。それが動的配列クラステンプレート vector です。

 先ず、どんなものかを実際に使って見てみましょう。ヘッダファイルは vector です。

プログラム
// Vector1.cpp
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector <int> vct(10);
    int i;

    for(i = 0; i < vct.size(); i++)
        vct[i] = 0;
    for(i = 0; i < vct.size(); i++)
        cout << vct[i] << ' ';
    cout << endl;

    vct.resize(5);
    for(i = 0; i < vct.size(); i++)
        vct[i] = 1;
    for(i = 0; i < vct.size(); i++)
        cout << vct[i] << ' ';
    cout << endl;

    return 0;
}
実行結果
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1

 先ず、vector はクラステンプレートなので、テンプレート引数を渡しています。これが配列要素の型になります。ここでは int を渡しています。

 次に、コンストラクタに 10 を渡しています。これは配列のデフォルトのサイズになります。他にも、別の vector で初期化したり、初期値を指定したりも出来ます。

 で、次に for を使って vct[0] 〜 vct[9] に 0 を代入しています。ここで、size メンバ関数を使って配列のサイズを取得しています。また、[ ] 演算子がオーバーロードされていることも分かります。で、次に中身を表示しています。

 次に、resize メンバ関数を使って配列のサイズを変更しています。そして同じようなことをしています。

 と、これが vector なわけです。

 この vector は動的配列クラステンプレートなので、配列はもちろん new を使って確保しています。上にはそのメモリを解放するようなコードはないように見えますが、実はこのメモリの解放は vector のデストラクタが自動的に行ってくれます。

 また、resize によって配列が最初の時より拡張されたときは、新しくメモリが用意され、そこに中身がコピーされ、そして古いメモリが解放されます。縮小される場合はメモリを解放せず、サイズを保持しているメンバ変数の値を変え、場合によっては、使われなくなった要素のデストラクタが呼ばれます。

 まぁ、そんな細かいことは置いておいて(実際はこのことを頭に入れてないと困ることもありますが)、vector を使えば簡単に動的可変長配列が使えるのです。


 このようにSTLでは、よく使うデータ構造に対してさまざまなクラステンプレートが作られています。配列に対しては vectorリスト第3部第32章第33章参照)に対しては listキューに対しては deque 、queue 、priority_queue 、stack二分探索木第3部第35章参照)に対しては set 、map 、multimap 、multiset 、そして文字列に対しては string という具合です。最近はハッシュ(第3部第36章参照)を使った hash_set 、hash_multiset、hash_map 、hash_multimap というのも追加されました。

 これらのクラステンプレートのことを、STLではコンテナと呼びます。コンテナとは入れ物という意味で、まさにデータの入れ物であるわけです。

 これらのデータ構造はよく使うもので、これらがライブラリとして提供されるのはとても嬉しいことです。テンプレートということもあり、別の型の実体を追加するごとにプログラムサイズは大きく増えてしまいますが、それを補ってあまりある魅力があると言えるでしょう。


 では、今回の要点です。


 今回のループ文にはアルゴリズムを使いませんでした。次回はアルゴリズムを使ってこのループ処理を行ってみましょう。それでは。


第4章 偽ポインタ | 第6章 コンテナ2

Last update was done on 2001.7.19

この講座の著作権はロベールが保有しています