パープルハット

※当サイトではGoogleアドセンス広告を利用しています

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を使えばできます。
  • 別記事にまとめたので参考にしてください。

kiironomidori.hatenablog.com




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("");
	}
}

実行結果

32列の行列
1, 2,
3, 4,
5, 6,