パープルハット

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

C++ vector forループ


各手法の使い分け方

C++でのvectorのforループの方法を3つほど紹介します。
私が使用して感じる各手法のメリット・デメリットを示すので参考にしてください(あくまで個人の感想です)。

(1)size (2)範囲for文 (3)イテレータ
コードのわかりやすさ
コードの短さ ×
全要素に対しての操作
findなどの関数との併用 ×




(1) sizeを使う方法

  • sizeで要素数を取得して、 0 \leq i < sizeでループをする方法です。
  • C言語の配列でもよく使われる一番わかりやすい方法だと思います。

ソースコード

#include<iostream>
#include<vector>

int main() {
	std::vector<int> intVec{ 3, 4, 2};

	// C言語のようなfor文で表示
	for (int i = 0; i < intVec.size(); i++) {
		std::cout << intVec[i] << ", ";
	}
}

実行結果

3, 4, 2,




(2) 範囲for文を使う方法

C++特有の機能で、(1)のやり方よりも短く記述できます。

for (int v : int型vector) {
}

とすると、vにvectorの要素が順に格納されていきます。
ループ内で値を書き換えるときは、参照しながら渡す必要があるので&をつけて、

for (int& v : int型vector) {
}

とするようにしましょう。


使用例1:全要素の列挙

ソースコード

#include<iostream>
#include<vector>

int main() {
	std::vector<int> intVec{ 3, 4, 2};

	// 範囲for文で表示
	for (int v : intVec) {
		std::cout << v << ", ";
	}
}

実行結果

3, 4, 2,



使用例2:各要素を-1倍にする

先ほど紹介したように、&で参照するようにしましょう。

ソースコード

#include<iostream>
#include<vector>

int main() {
	std::vector<int> intVec{ 3, 4, 2 };

	// 各要素を-1倍
	for (int& v : intVec) {
		v *= -1;
	}

	// 値の表示
	for (int v : intVec) {
		std::cout << v << ", ";
	}
}

実行結果

-3, -4, -2,





(3) イテレータを使った方法

  • vectorはmap, set型と同じコンテナクラスであり、イテレータを持つのでこの方法も使えます。
  • vector型変数をvとしたとき、次のようなイテレータが取得できます。
v.begin() 先頭のイテレータ
v.end() 末尾の次のイテレータ


イテレータの型名は長いので、autoで受け取るのが無難だと思います。
また、イテレータ型変数をiteとしたとき、そこに格納されている値は*iteとなります。

使用例1:全要素の列挙

ソースコード

#include<iostream>
#include<vector>

int main() {
	std::vector<int> intVec{ 3, 4, 2};

	// イテレータを使い表示
	for (auto ite = intVec.begin(); ite < intVec.end(); ite++) {
		std::cout << *ite << ", ";
	}
}

実行結果

3, 4, 2,



使用例2:各要素を3にする

範囲for文のときと異なり&は不要です。

ソースコード

#include<iostream>
#include<vector>

int main() {
	std::vector<int> intVec{ 3, 4, 2 };

	// 各要素に3を代入
	for (auto ite = intVec.begin(); ite < intVec.end(); ite++) {
		*ite = 3;
	}

	// 各要素を表示
	for (auto ite = intVec.begin(); ite < intVec.end(); ite++) {
		std::cout << *ite << ", ";
	}
}

実行結果

3, 3, 3,



使用例3:findで発見した要素より後ろの要素を列挙

  • vectorには指定した要素を発見するfindなどの便利な関数があります。
  • これらの関数で取得できるのは多くの場合イテレータなので、組み合わせやすいです。
  • findの使い方が分からない方はこちらの記事を参考に⇒準備中

ソースコード

#include<iostream>
#include<vector>
#include<algorithm>

int main() {
	std::vector<int> v{ 1, 3, 5, 7, 10, 12 };

	// findで「5」のイテレータを取得
	auto fiveIte = std::find(v.begin(), v.end(), 5);

	// 「5」とそれより後ろの要素を列挙
	for (auto ite = fiveIte; ite < v.end(); ite++) {
		std::cout << *ite << ", ";
	}
}

実行結果

5, 7, 10, 12,





その他のループ方法

C++ではfor以外にもfor_eachtransformを使ったループ方法があります。
ただ、基本的には上記の処理でOKだと思います。
一応、これらについても別記事にまとめたので、良かったら参考にしてください。