C++ vectorまとめ(for, 追加・削除, 検索, 2次元など)
本記事の概要
- 本サイトに書かれたvector関連の概要をまとめたものです。
- 詳細は個別記事を参考にしてください。
宣言と初期化
可変長の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)
- 変数名.size()とすることで要素数を簡単に取得ができます。
ソースコード
#include<iostream> #include<vector> int main() { //中身が{3, 4, 2}の可変長配列 std::vector<int> intVec{ 3, 4,2 }; //配列のサイズを取得 std::cout << "配列のサイズ:" << intVec.size() << std::endl; }
実行結果
配列のサイズ:3
for文での表示
詳細記事:C++ vector forループ - パープルハット
(1)sizeを使う方法
C言語の配列でも見る、参考書とかにもよく載っているやり方です。
ソースコード
std::vector<int> v{ 3, 4, 2 }; // C言語のようなfor文("3, 4, 2,"と表示) for (int i = 0; i < v.size(); i++) std::cout << v[i] << ", ";
(2)範囲for文を使う方法
C++特有の機能で、(1)のやり方よりも短く記述できます。
std::vector<int> v{ 3, 4, 2 }; // 範囲for文("3, 4, 2,"と表示) for (int a: v) std::cout << a << ", ";
(3)イテレータを使った方法
- vectorはmap, set型と同じコンテナクラスであり、イテレータを持つのでこの方法も使えます。
- とはいえ、普通にループしたいなら(1), (2)の方法が無難だと思います。
std::vector<int> v{ 3, 4, 2 }; // イテレータを使う("3, 4, 2,"と表示) for (auto ite = v.begin(); ite < v.end(); ite++) std::cout << *ite << ", ";
追加・削除
詳細記事:C++ vector 追加と削除(push_back, insert, erase, etc) - パープルハット
末尾への要素の追加(push_back)
- 変数名.push_back(追加したい要素)とすることで末尾に要素を追加することが可能です。
std::vector<int> v{ 3, 4, 2 }; //末尾に7を追加 v.push_back(7); // v = {3, 4, 2, 7}
n番目に要素を追加(insert)
- イテレータを使うことでn番目に要素を追加できます。
- イテレータにはbegin()~end()まで指定できます。
std::vector<int> v{ 3, 4, 2 }; // 前から2番目に"-2"を追加 v.insert(v.begin() + 1, -2); // v = { 3, -2, 4, 2}
n番目の要素の削除(erase)
指定できるイテレータがbegin()~end()-1までな点に注意。
std::vector<int> v{ 1, 2, 3, 4, 5, 6 }; //前から2番目の要素を削除 v.erase(v.begin() + 2); // v = { 1, 2, 4, 5, 6 }
検索
最大値・最小値の取得(min・max_element)
詳細記事:C++ vectorの最大値・最小値(min・max_elementなど) - パープルハット
- vector内の最大値・最小値のイテレータを取得することができる関数です。
- イテレータとして取得できるので、「*取得したイテレータ」とすることで最大値・最小値の表示が可能となります。
ソースコード
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v{ 3, 4, -1, 7, 5, 8 }; // 最大値・最小値のイテレータを取得 auto maxIte = std::max_element(v.begin(), v.end()); auto minIte = std::min_element(v.begin(), v.end()); // 最大値・最小値のインデックスを取得 int maxIndex = std::distance(v.begin(), maxIte); int minIndex = std::distance(v.begin(), minIte); // 表示 std::cout << "max: index = " << maxIndex << ", value = " << *maxIte << std::endl; std::cout << "min: index = " << minIndex << ", value = " << *minIte << std::endl; }
実行結果
max: index = 5, value = 8 min: index = 2, value = -1
指定した要素以上 or それより大きい要素のインデックスをチェック
- lower_bound or upper_boundを使えばできます。
- 別記事にまとめたので参考にしてください。
2次元配列
詳細記事:C++ vector 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} }; //配列のサイズを取得 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,