1. ホーム
  2. c++

[解決済み] C++ベクトルを端から端まで反復処理する。

2022-07-12 04:30:14

質問

ベクトルの端から端まで反復処理することは可能ですか?

for (vector<my_class>::iterator i = my_vector.end();
        i != my_vector.begin(); /* ?! */ ) {
}

とかそういうのしかないのかな。

for (int i = my_vector.size() - 1; i >= 0; --i) {
}

どのように解決するのですか?

一つの方法として

for (vector<my_class>::reverse_iterator i = my_vector.rbegin(); 
        i != my_vector.rend(); ++i ) { 
} 

rbegin() / rend() は特にそのために設計されました。(そして、はい、インクリメントされた reverse_interator をインクリメントすると、それが後方に移動します)。

さて、理論的には、あなたの方法( begin() / end() & --i ) が動作するでしょう。 std::vector のイテレータは双方向性ですが、覚えておいてください。 end() は最後の要素ではありません。最後の要素のひとつ先なので、最初にデクリメントしなければならず、に到達したら終了です。 begin() - に到達した時点で終了ですが、まだ処理を行わなければなりません。

vector<my_class>::iterator i = my_vector.end();
while (i != my_vector.begin())
{
     --i;
    /*do stuff */

} 

UPDATE: 私はどうやら強引に for() ループを while() ループに変換します。(重要なのは --i が冒頭にあることです)。