概要
C++のSTLで与えられるVectorの機能をまとめる。
C言語を使っている人がわかるように心がける。
クラスで使うことの違い
先にint型で使う例を示した。
http://qiita.com/kooka2525/items/b018916745d889814e43
ここではクラス型にしただけである。
少々使い方が異なるのでその点について説明する。
ソースコードを見てみる
ソースコードを以下に示す。
#include <iostream>
#include <vector>
using namespace std;
class test_vector
{
private:
int Number;
public:
test_vector() { Number = 0; };
test_vector(int _Number) { this->Number = _Number; };
void Set_Number(int _number) { this->Number = _number; };
int Get_Number() { return this->Number; };
};
/*****************************************************************
test_vectorクラス
メンバ変数はint型のNumberしかない。
プライベートな変数なのでそれに対するSet,Getのみ。
*****************************************************************/
int main()
{
vector<test_vector> test1(5);
for (int i = 0; i < 5; i++)
test1.at(i).Set_Number(i); //test1.i番目に値を設定
for (int i = 0; i < 5; i++)
test1.push_back(1); //末端から追加される
for (int i = 0; i < 10; i++)
cout << test1[i].Get_Number(); //test1.i番目の値を表示
cout << endl;
for (int i = 0; i < 5; i++)
test1.pop_back(); //末端から削除される
for (int i = 0; i < 5; i++)
cout << test1[i].Get_Number(); //test1.i番目の値を表示
cout << endl;
return 0;
}
ソースコード中に
test1.at(i)
test1[i]
と言った表記があるが、これは同様のものである。
配列のように利用できる(クラスを配列で動的確保してるから当然といえば当然であるが)。
【追記】
@yumetodoさんより、プログラムの修正リクエストを頂きました。
以下に示します。
この記事の下記のコメントを参考に、何が悪く何が良いのか読んでいただければと思います。
尚、こちらのプログラムは私の環境下で動作確認をしておりません。
また、書き換えたことによりどのように変わるかはこの記事の趣旨ではありませんので省くこととします。
#include <iostream>
#include <vector>
class test_vector
{
private:
int number_;
public:
test_vector() : number_() {};
test_vector(int number) : number_(number) {};
void Set_Number(int number) { this->number_= number; };
int Get_Number() { return this->number_; };
};
/*****************************************************************
test_vectorクラス
メンバ変数はint型のnumber_しかない。
プライベートな変数なのでそれに対するSet,Getのみ。
*****************************************************************/
int main()
{
using std::cout;
using std::endl;
std::vector<test_vector> test1(5);
for (int i = 0; i < 5; i++)
test1.at(i).Set_Number(i); //test1.i番目に値を設定
for (int i = 0; i < 5; i++)
test1.push_back(1); //末端から追加される
for (int i = 0; i < 10; i++)
cout << test1[i].Get_Number(); //test1.i番目の値を表示
cout << endl;
for (int i = 0; i < 5; i++)
test1.pop_back(); //末端から削除される
for (int i = 0; i < 5; i++)
cout << test1[i].Get_Number(); //test1.i番目の値を表示
cout << endl;
return 0;
}
ソースコード中の狙い
コンストラクタでは0で初期化しているので最初に確保した5つでは0で確保されていて
新たに追加したものには1で追加されているはずである。
(コンストラクタをオーバーロードしてるのはそのため)
C++を学んでるものなら他の説明は不要であるように思えるので略す。
動作確認
実際に実行すると
0123411111
01234
続行するには何かキーを押してください . . .
と表示することができた。
確かに末端にデータが追加され、末端からデータが削除されている。