第64章 vectorクラスを使う


この章ではvectorクラスを取り扱います。vectorというライブラリをインクルードする 必要があります。vectorクラスには、あるデータ型とかクラスをまとめて、格納し取り出しも簡単です。



使い方は

vector<データ型> vec;
というように、オブジェクトを生成しておいて、これにデータを追加していきます。

たとえば

vector<int> v;

とすれば、このオブジェクトにはint型データをどんどん詰め込むことができます。 詰め込むには、push_backメンバ関数を使いいます。

vector<int> v;
v.push_back(500);
v_push_back(400);
などのように使います。詰め込んだデータにアクセスするには
v[n]
とします。最初のデータはv[0], 次のデータはv[1],...というようになります。

オブジェクトに格納されているデータの個数はsizeメンバ関数でわかります。 ここで、注意しなくてはいけないのはsizeメンバ関数の戻り値はvector<型名>::size_type型なので

int i;
if (i < v.size()) {
...
}
などというように使うと警告がでます。この場合v.size()をint型にキャストしてしまえばワーニングが出なくなります。

では、簡単なプログラムを作ってみましょう。適当な数値を入力していき平均値を出すというものです。入力が終了したら、「数値を入力--」のところで何も入力せずにリターンキーを押します。また、数値入力時に数値以外のものを入力すると0.0と見なされます。 また、入力時にスペースを入れると、スペース以降は無視されます。「0.5 32 158」と入力すると0.5とみなされます。

2番目の入力時にスペースを入れて2つの数値を入力していますが、スペース以降は 無視されています。

3番目の入力時に数値以外を入力しているので0.0として扱われました。

数値を入れ終わったら、何も入力せずにリターン・キーを押します。



プログラムのソースは次のようになっています。

// vector01.cpp

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<double> v;
    char str[32];
    double x, sum = 0;
    int i;

    while (1) {
        cout << "数値を入力-- ";
        gets(str);
        
        if (strcmp(str, "") == 0)
            break;
        
        x = atof(str);
        v.push_back(x);
        sum += x;
    }

    cout << "data------" << endl;
    for (i = 0; i < (int)v.size(); i++) {
        cout << "[" << i << "] " << v[i] << endl;
    }

    if ((int)v.size() == 0) {
        cout << "データはありません" << endl;
    } else {
        cout << "平均値= " << sum / (double)v.size() << endl;
    }


    return 0;
}
数値データを入力せずにいきなり、リターン・キーを押したときにも対応できるようにしてあります。

次に、もう少し違う例を見てみましょう。

2種類のデータ(氏名と住所)を別々のオブジェクトに格納しています。 どちらも同じデータ型なので一つのオブジェクトに格納してもよいのですが あえて2つに分けてみました。

このようにすると、一つのデータの入力の失敗があると、以降氏名と住所が 全部ずれてしまい大変まずいことになります。そこで、住所入力の時に 何も入力しなくても、それをデータとするようにしています。

また、データ型にはstringクラスを使っています。



// vector02.cpp

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> name, address;
    string s;
    int i;

    cout << "氏名入力でリターン・キーで終了" << endl;

    while (1) {
        cout << "氏名== ";
        getline(cin, s);
        if (s == "")
            break;
        name.push_back(s);
        cout << "住所== ";
        getline(cin, s);
        address.push_back(s);
    }
    cout << endl;
    cout << "簡易住所録" << endl;

    for (i = 0; i < (int)name.size(); i++) {
        cout << name[i] << "--- " << address[i] << endl;
    }
    return 0;
}
これを、ファイルに保存できるように改良してみてください。また、データの修正も できるように改良してみてください。
[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jul/08/2002 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。