本記事では普通の配列をより便利に拡張し、可変長配列を簡単に扱うことの出来る、C++の動的配列クラス(std::vector)に解説します。
std::vectorとは?
std::vector
とは配列の長さを自由に変更することができるクラスです。普通の配列だとはじめに配列のサイズを指定しなければいけなく、後から配列のサイズを変えることはできない。例えば、int a[10]と配列の大きさもはじめに宣言しなければいけなく、後から配列のサイズの大きさを変更することもできません。しかし、std::vectorを用いることでそれらを可能にすることができます。また、配列要素数を参照できたりなど、普通の配列と比べて非常に便利です。
std::vectorの使い方(includeから配列の宣言まで)
インクルード~vectorの宣言
std::vectorを使うために以下のようにインクルードする必要があります。また本記事では、std::vectorからvectorと記述するためにするため名前空間stdを指定しています。またvectorを宣言するときはvector<型名> 変数名
として宣言します。このときあらかじめ配列の大きさを指定する場合はvector<型名> 変数名(サイズ)
のように記述します。さらに、配列の中の値を指定した値に初期化する場合は、vector<型名> 変数名(サイズ,初期化したい値)
のように記述します。
#include <vector> using namespace std;//名前空間を指定 int main() { vector<int> x;//名前空間を指定してないならstd::vector<int> x; vector<int> x(3); vector<double> x(3,3.14); }
二次元配列の宣言
vectorを用いて二次元配列を宣言する場合はvector<vector<型名>> 変数名(サイズ,初期化したい値)
と記述します。最後の行のvector<vector<int>> xy(3, vector<string>(3, "abc"));
は以下の表のように3×3の行列で「abc」という文字が全て、格納されています。
vector<vector<string>> xy; vector<vector<string>> xy(3); vector<vector<string>> xy(3, vector<string>(3)); vector<vector<string>> xy(3, vector<string>(3, "abc"));
int | 0 | 1 | 2 |
0 | abc | abc | abc |
1 | abc | abc | abc |
2 | abc | abc | abc |
std::vectorの使い方(配列の処理)
値の参照&代入
値の参照や代入に関してはvectorの宣言ができれば、あとは普通の配列処理と同じやり方でできます。
タイトル:vector1.cpp
#include<iostream> #include<string> #include <vector> using namespace std; int main() { vector<vector<string>> xy(3, vector<string>(3,"abc")); cout<< xy[1][1]<< endl; xy[1][1]="def"; cout<< xy[1][1]<< endl; return 0; }
タイトル:出力
abc def
要素数の参照&変更
vectorの要素数を参照する場合、変数名.size()
とすることで参照することができます。二次元配列の場合変数名.size()
で行の数、変数名[0].size()
で列の数を取得することができます。また、変数.resize(変更したい要素数)
とすることで、配列の要素数を変更することもできます。
タイトル:vector1.cpp
#include<iostream> #include<string> #include <vector> using namespace std; int main() { vector<string> x(3, "abc");//1*3 vector<vector<string>> xy(4, vector<string>(3,"abc"));//4*3 cout << x.size() << endl; //3 x.resize(5);//5に変更 cout << x.size() << endl; //5 cout<< xy.size()<< endl; //4 cout<< xy[1].size()<< endl;//3 xy.resize(5); //5*5に変更 for(int i=0; i<5; i++){ xy[i].resize(5); } cout<< xy.size() << endl; //5 cout<< xy[0].size() << endl; //5 return 0; }
タイトル:出力
3 5 4 3 5 5
配列の末尾に要素を追加する
vectorのpush_back()を用いることで配列の末尾に要素を追加することもできます。例えばx.push_back(3)
とすることで、xという配列の末尾に3という数字を追加されます。
タイトル:pushback1.cpp
#include<iostream> #include<string> #include <vector> using namespace std; int main() { vector<string> x(3, "abc");//1*3 x.push_back("def"); for(int i=0;i<x.size();i++){ cout << x[i] << endl; } return 0; }
タイトル:出力
abc abc def
また2次元配列における末尾への要素の追加は以下のように記述します。
タイトル:pushback2.cpp
#include<iostream> #include<string> #include <vector> using namespace std; int main() { vector<vector<string>> xy(3, vector<string>(3,"abc"));//3*3 xy[0].push_back("def"); for(int i=0;i<xy.size();i++){ for(int j=0;j<xy[i].size();j++){ cout << xy[i][j]<< " "; } cout << endl; } return 0; }
タイトル:出力
abc abc abc def abc abc abc abc abc abc
要素の削除
vectorでは変数名.erase(指定位置)
を用いることで指定した場所の要素を削除することができます。
タイトル:erase.cpp
#include<iostream> #include<string> #include <vector> using namespace std; int main() { vector<string> x={"abc","def","ghi"};//1*3 x.erase(x.begin()+1);//先頭から+1番目 for(int i=0;i<x.size();i++){ cout << x[i] << " "; } cout << endl; x.erase(x.end()-1);//末尾 for(int i=0;i<x.size();i++){ cout << x[i] << " "; } cout << endl; return 0; }
タイトル:出力
abc ghi abc
まとめ
本記事ではstd::vectorの使い方について紹介しました。では要点をまとめます。
- std::vectorとは普通の配列をより便利に拡張したC++の動的配列クラス
- 宣言してしまえば普通の配列として扱うことができる
- 配列の要素数の参照・変更が可能
- 配列の末尾に要素の追加が可能
- 指定した位置の要素の削除が可能
ぜひ、普通の配列をより便利に拡張したC++のstd::vectorを使ってみてください