逆方向の反復については、この回答を参照してください。
前方への反復はほとんど同じです。イテレータを変更するだけで、デクリメントをインクリメントでスワップできます。イテレータを優先する必要があります。std::size_t
インデックス変数型として使用するように言う人もいます。ただし、それは移植性がありません。常にコンテナの typedef を使用してください (前方反復の場合は変換のみで回避できますが、後方反復の場合は、 の typedef よりも幅が広い場合size_type
に、実際には完全にうまくいかない可能性があります) 。 :std::size_t
std::size_t
size_type
std::vector の使用
イテレータの使用
for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
/* std::cout << *it; ... */
}
重要なのは、定義がわからないイテレータには、常にプレフィックスのインクリメント形式を使用することです。これにより、コードが可能な限り汎用的に実行されるようになります。
範囲 C++11 の使用
for(auto const& value: a) {
/* std::cout << value; ... */
インデックスの使用
for(std::vector<int>::size_type i = 0; i != v.size(); i++) {
/* std::cout << v[i]; ... */
}
配列の使用
イテレータの使用
for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {
/* std::cout << *it; ... */
}
範囲 C++11 の使用
for(auto const& value: a) {
/* std::cout << value; ... */
インデックスの使用
for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {
/* std::cout << a[i]; ... */
}
sizeof
ただし、アプローチがどのような問題につながる可能性があるかについては、後方反復の回答を読んでください。