私は C++ 言語の初心者です。ベクターを使い始めたのですが、インデックスを介してベクターを反復処理するすべてのコードで、ループの最初のパラメータfor
が常にベクターに基づくものであることに気付きました。Java では、ArrayList を使用して次のような操作を行うことがあります。
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
C++ でこれが見られないのは何か理由があるのでしょうか? これは悪い習慣なのでしょうか?
ベストアンサー1
そのような実践が見られない理由は非常に主観的であり、明確な答えはありません。なぜなら、iterator
スタイル コードではなく、あなたが言及した方法を使用するコードをたくさん見てきたからです。
vector.size()
一部のプログラマーがループの方法を考慮しない理由としては、次のことが考えられます。
size()
ループ条件で毎回呼び出すことに神経質になる(つまりfor(... ; i < v.size(); ...)
、しかし、それは問題ではないか、簡単に修正できる。- ループ自体
std::for_each()
よりも優先するfor
- 後でコンテナを から
std::vector
他のコンテナ (例 ) にmap
変更するとlist
、ループメカニズムの変更も必要になります。これは、すべてのコンテナがsize()
ループのスタイル (つまりstd::map
)をサポートしているわけではないためです。
C++11 は、コンテナを反復処理するための優れた機能を提供します。これは、「範囲ベースの 'for' ループ」(または Java では「拡張 'for' ループ」) と呼ばれます。
少しのコードで、全体を走査することができます (これは必須です!) std::vector
:
vector<int> vi;
...
for(const int& i : vi)
cout << "i = " << i << endl;