この章では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;
}
これを、ファイルに保存できるように改良してみてください。また、データの修正も
できるように改良してみてください。
Update Jul/08/2002 By Y.Kumei