1次元配列について
宣言と初期化
可変長の1次元配列の宣言は
std::vector<型名> 変数名;
というようにできます。
また、宣言と同時に初期化をすることも可能です。通常の配列の様に
//中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4, 2 };
と宣言することができます。
また、要素をすべて同じNで初期化(全て0にするなど)の場合は(要素数, N)と初期化することもできます。
//中身が{0, 0, 0}の可変長配列 std::vector<int> zeroVec(3, 0);
要素の追加
「可変長」とついているので要素を追加することが可能です。追加する場合は「変数名.push_back(追加したい要素)」とすることで末尾に要素を追加することが可能です。
for文でループする(プログラム例)
vectorは「変数名.size()」とすることで配列の大きさを簡単に取得ができます。
これを利用すれば配列に対するfor文が容易に実装できます。
#include<iostream> #include<vector> int main() { //中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4,2 }; //配列のサイズを取得 std::cout << "配列のサイズ:" << intVec.size() << std::endl; //中身を列挙 for (int i = 0; i < intVec.size(); i++) { printf("intVec[%d] = %d\n", i, intVec[i]); } //末尾に7を追加 std::cout << "\n末尾に7を追加" << std::endl; intVec.push_back(7); //配列のサイズを取得 std::cout << "配列のサイズ:" << intVec.size() << std::endl; //中身を列挙 for (int i = 0; i < intVec.size(); i++) { printf("intVec[%d] = %d\n", i, intVec[i]); } }
実行結果
配列のサイズ:3 intVec[0] = 3 intVec[1] = 4 intVec[2] = 2 末尾に7を追加 配列のサイズ:4 intVec[0] = 3 intVec[1] = 4 intVec[2] = 2 intVec[3] = 7
2次元配列について
宣言と初期化
2次元配列となると宣言が少し複雑になり、
std::vector<std::vector<型名>> 変数名;
と宣言します。
1次元配列と同様の初期化が可能であり、通常の配列の様にする場合は、
std::vector<std::vector<int>> intVec2{ {3, 2}, {1, 9} };
と宣言し、要素をすべて同じ0で初期化する場合は、
//3行2列の零行列 std::vector<std::vector<int>> zeroVec2(3, std::vector<int>(2, 0));
とします。
for文でのループ
2次元の可変長配列vecを行列として考えると
- vec.size()で行数
- vec[0].size()で列数
を取得できるので、これを利用すれば2次元の可変長配列に対しても簡単にfor文を実装できます。
#include<iostream> #include<vector> int main() { //2次元の可変長配列 std::vector<std::vector<int>> intVec2{ {1, 2}, {3, 4}, {5, 6} }; //2行2列の零行列 std::vector<std::vector<int>> zeroVec2(2, std::vector<int>(2, 0)); //配列のサイズを取得 printf("%d行%d列の行列\n", intVec2.size(), intVec2[0].size()); //中身を列挙 for (int i = 0; i < intVec2.size(); i++) { for (int j = 0; j < intVec2[0].size(); j++) { std::cout << intVec2[i][j] << ", "; } puts(""); } }
3行2列の行列 1, 2, 3, 4, 5, 6,