各手法の使い分け方
C++でのvectorのforループの方法を3つほど紹介します。
私が使用して感じる各手法のメリット・デメリットを示すので参考にしてください(あくまで個人の感想です)。
(1)size | (2)範囲for文 | (3)イテレータ | |
---|---|---|---|
コードのわかりやすさ | 〇 | 〇 | △ |
コードの短さ | △ | 〇 | × |
全要素に対しての操作 | △ | 〇 | △ |
findなどの関数との併用 | △ | × | 〇 |
(1) sizeを使う方法
- 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_eachやtransformを使ったループ方法があります。
ただ、基本的には上記の処理でOKだと思います。
一応、これらについても別記事にまとめたので、良かったら参考にしてください。