基本(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);
大きさの取得
- 変数名.size()とすることで要素数を簡単に取得ができます。
- これを利用すればfor文などが実装できます。
ソースコード
#include<iostream> #include<vector> int main() { //中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4,2 }; //配列のサイズを取得 std::cout << "配列のサイズ:" << intVec.size() << std::endl; }
実行結果
配列のサイズ:3
for文での表示
- 先ほども触れたfor文の実装です。
- 範囲for文というC++特有の方法もありますが本記事では触れません。
ソースコード
#include<iostream> #include<vector> int main() { //中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4,2 }; // C言語のようなfor文で表示 for(int i = 0; i < intVec.size(); i++) { std::cout << "intVec[" << i << "] = " << intVec[i] << std::endl; } }
実行結果
intVec[0] = 3 intVec[1] = 4 intVec[2] = 2
末尾への要素の追加
- 「可変長」とついているので要素を追加することが可能です。
- 変数名.push_back(追加したい要素)とすることで末尾に要素を追加することが可能です。
ソースコード
#include<iostream> #include<vector> int main() { //中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4,2 }; //末尾に7を追加 std::cout << "末尾に7を追加" << std::endl; intVec.push_back(7); //中身を列挙 for (int i = 0; i < intVec.size(); i++) { printf("intVec[%d] = %d\n", i, intVec[i]); } }
実行結果
末尾に7を追加 intVec[0] = 3 intVec[1] = 4 intVec[2] = 2 intVec[3] = 7
任意の位置への要素の追加(insert)&削除(erase)
insertはbegin()~end()までだが、endはbegin()~end()-1までな点に注意。
ソースコード
#include <iostream> #include <vector> // vectorを表示する関数 void display(const std::vector<int>& intVec){ std::cout << "intVec = { "; for (int i = 0; i < intVec.size(); i++) { std::cout << intVec[i] << ", "; } puts("}\n"); } int main() { //中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4, 2 }; std::cout << "前から1番目に-2を追加" << std::endl; intVec.insert(intVec.begin() + 1, -2); display(intVec); //中身を列挙 std::cout << "後ろから1番目に10を追加" << std::endl; intVec.insert(intVec.end() - 1, 10); display(intVec); //中身を列挙 std::cout << "前から2番目の要素(4)を削除" << std::endl; intVec.erase(intVec.begin() + 2); display(intVec); //中身を列挙 std::cout << "後ろから0番目の要素(2)を削除" << std::endl; intVec.erase(intVec.end() - 1); display(intVec); //中身を列挙 }
実行結果
前から1番目に-2を追加 intVec = { 3, -2, 4, 2, } 後ろから1番目に10を追加 intVec = { 3, -2, 4, 10, 2, } 前から2番目の要素(4)を削除 intVec = { 3, -2, 10, 2, } 後ろから0番目の要素(2)を削除 intVec = { 3, -2, 10, }
並び替え(sort)
- sortという整列用の関数を使えるようになります。
- sort関数を使うには以下のインクルードが必要です。
C++では、
#include <algorithm>
ソースコード
- コメントアウトの箇所を動かせば降順になります
#include <iostream> #include <vector> #include <algorithm> int main() { //宣言 std::vector<int> intVec{ 3, 4, 2, 10, 8, -1 }; //昇順ソート std::sort(intVec.begin(), intVec.end()); //降順ソート //std::sort(intVec.begin(), intVec.end(), std::greater<>()); //中身を列挙 for (int i = 0; i < intVec.size(); i++) { printf("intVec[%d] = %d\n", i, intVec[i]); } return 0; }
実行結果
intVec[0] = -1 intVec[1] = 2 intVec[2] = 3 intVec[3] = 4 intVec[4] = 8 intVec[5] = 10
応用例: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,