[C++]Vectorを逆順でループするには?

C++

どうも、ちょげ(@chogetarou)です。

Vectorを逆順でループする方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

Vectorを逆順でループする方法は、4つあります。

for文でインデックスをループ

1つ目は、for文でインデックスを逆順でループする方法です。

まず、for文のループ変数をVectorの要素数を「-1」した値で初期化します。

for文の終了条件にループ変数が0以上を指定し、ループの最後に行う処理でループ変数を「-1」します。

そして、for文の{}内にループ処理を指定します。

//myVec = 対象のvector
for (int i = myVec.size() - 1; i >= 0; --i) {
    //ループ処理
}

上記のfor文は、Vectorのインデックスを逆順でループします。

使用例

#include <iostream>
#include <vector>
using namespace std;

int main(void){
    
    vector<int> nums = { 1, 2, 3, 4, 5, 6 };
    
    for (int i = nums.size() - 1; i >= 0; --i) {
        cout << nums[i] << " ";
    }
    
    return 0;
}
出力:
6 5 4 3 2 1 

for文でイテレーターをループ

2つ目は、for文でイテレーターをループする方法です。

まず、for文のループ変数をVectorから呼び出したrbegin()の値で初期化します。

for文の終了条件にループ変数がVectorから呼び出したrend()の値でないことを指定し、ループの最後に行う処理でループ変数を「+1」します。

そして、for文の{}内にループ処理を指定します。

ループ処理では、Vectorの要素をループ変数の参照で取得します。

//myVec = 対象のvector
for (auto i = myVec.rbegin(); i != myVec.rend(); ++i) {
    //ループ処理
}

上記のfor文は、Vectorを逆順でループします。

rbegin()は逆順のイテレータの最初の要素(通常のイテレータの最後の要素)、rend()は逆順のイテレータの最後の要素(通常のイテレータの先頭の要素)を取得します。

使用例

#include <iostream>
#include <vector>
using namespace std;

int main(void){
    
    vector<int> nums = { 1, 2, 3, 4, 5, 6 };
    
    for (auto i = nums.rbegin(); i != nums.rend(); ++i) {
        cout << *i << " ";
    }
    
    return 0;
}
出力:
6 5 4 3 2 1 

whileでイテレーターをループ

3つ目は、whileでイテレーターをループする方法です。

まず、ループ用の変数をVectorから呼び出したrbegin()の値で初期化します。

whileの終了条件に、ループ用の変数がVectorから呼び出したrend()の値ではないことを指定します。

次に、whileの{}内にループ処理を指定します。

ループ処理では、Vectorの要素をループ変数の参照で取得します。

最後に、whileのループ処理の最後で、ループ変数の値を「+1」します。

//T = vectorの要素の型, myVec = 対象のvector
vector<T>::reverse_iterator i = myVec.rbegin();
while (i != myVec.rend()) {
    //ループ処理
    ++i;
}

上記のwhileは、Vectorを逆順でループします。

rbegin()は逆順のイテレータの最初の要素(通常のイテレータの最後の要素)、rend()は逆順のイテレータの最後の要素(通常のイテレータの先頭の要素)を取得します。

使用例

#include <iostream>
#include <vector>
using namespace std;

int main(void){
    
    vector<int> nums = { 1, 2, 3, 4, 5, 6 };
    
    vector<int>::reverse_iterator i = nums.rbegin();
    while (i != nums.rend()) {
        cout << *i << " ";
        ++i;
    }
    
    return 0;
}
出力:
6 5 4 3 2 1 

for_eachで要素をループ

4つ目は、for_eachで要素をループする方法です。

まず、for_eachを呼び出します。

次に、for_eachの第1引数にVectorから呼び出したrbegin()、第2引数にVectorから呼び出したrend()を指定します。

for_eachの第3引数に、引数1つの関数を指定します。

関数の{}内に、ループ処理を指定します。
(関数の引数で、Vectorの要素を取得)

//T = vectorの要素の型, myVec = 対象のvector
for_each(myVec.rbegin(),
            myVec.rend(), 
            [] (T x) {
                //ループ処理
                //引数で要素を取得
            });

上記のfor_eachは、Vectorを逆順でループします。

rbegin()は逆順のイテレータの最初の要素(通常のイテレータの最後の要素)、rend()は逆順のイテレータの最後の要素(通常のイテレータの先頭の要素)を取得します。

使用例

#include <iostream>
#include <vector>
using namespace std;

int main(void){
    
    vector<int> nums = { 1, 2, 3, 4, 5, 6 };
    
    for_each(nums.rbegin(),
            nums.rend(), 
            [] (int x) {
                cout << x << endl;
            });
    
    return 0;
}
出力:
6
5
4
3
2
1

まとめ

Vectorを逆順でループする方法は、次の4つです。

  • for文でインデックスをループする方法
    for (int i = myVec.size() - 1; i >= 0; --i) { ループ処理 }
  • for文でイテレーターをループする方法
    for (auto i = myVec.rbegin(); i != myVec.rend(); ++i) { ループ処理 }
  • whileでイテレーターをループする方法
    vector<T>::reverse_iterator i = myVec.rbegin();
    while (i != myVec.rend()) { /*ループ処理*/ ++i; }
  • for_eachで要素をループする方法
    for_each(myVec.rbegin(), myVec.rend(), [] (T x) { ループ処理 });

コメント

タイトルとURLをコピーしました