最も明白な答えは次のとおりです。必要なセマンティクスを持っているのはどれですか? オブジェクトを異なる順序で訪問します。
原則として、他に考慮事項がない場合、人々は昇順を期待します。これは、オブジェクトにアクセスするときに使用する必要があるものです。C++ では、これに反復子を使用する方がはるかに慣用的です。通常のイテレータは昇順でアクセスし、逆のイテレータは降順でアクセスします。明示的に降順が必要ない場合は、通常の反復子を使用する必要があります。これは人々が期待することであり、リバース イテレータを使用する場合、読者が最初に尋ねるのはその理由です。また、測定はしていませんが、通常のイテレータが逆イテレータよりも高速であったとしても驚かないでしょう。Java では、反復子も慣用的であり、逆反復子はありません。
訪問時に降順が必要な場合は、while ループを使用します (逆反復子がない場合は、それが自動的に実行されます)。私は次のようなものを見つけます:
int index = numberOfElements;
while ( index != 0 ) {
-- index;
// ...
}
どの代替手段よりもはるかに読みやすく (そして正しく理解するのが簡単です)。
オブジェクトにアクセスするのではなく、カウントするだけの場合は、降順の方が自然に思えます。制御変数には残りの回数が含まれます。また、カウントがインデックスとして使用されることはありませんので、インデックスとして 1 つオフになっても問題はなく、従来のfor
.
for ( int count = numberOfTimes; count != 0; -- count ) {
// ...
}
しかし、それはスタイルの問題です。これについても、多くの上昇ループを見てきました。