24

c++11 で、ベクトルに範囲ベースの for ループを使用すると、反復順序は保証されますか?

つまり、次のコード ブロックは同じ出力を生成することが保証されていますか?

vector<T> output;
vector<U> V;
for( auto v: V) output.push_back(f(v));

for(int i =0; i < V.size(); ++i) output.push_back(f(V[i])); 

vectorそうでない場合はどうなりmapますか?

4

3 に答える 3

24

はい、2 つのコードは同じことが保証されています。標準へのリンクはありませんが、こちらをご覧ください。私は引用します:You can read that as "for all x in v" going through starting with v.begin() and iterating to v.end().

于 2013-09-27T13:31:07.497 に答える
10

はい、いいえ (使用しているコンテナによって異なります):

  • for(iterator pos = range.begin(); pos != range.end(); ++pos) { /* with a range variable = *pos */ ... } のようなループです。
  • 演算子 [] は別のことを行う場合があります (たとえば、キーが存在しない場合、std::map 演算子はキーを検索して新しいエントリを作成します)。

例:

#include <iostream>
#include <map>

int main()
{
    typedef std::map<int, int> map;
    map m = { { 0, 0 }, { 2, 2 }, { 4, 4 } };
    for(const auto& e : m) {
        std::cout << e.first << " ";
    }
    std::cout << std::endl;
    for(map::size_type i = 0; i < m.size(); ++i) {
        std::cout << m[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}

結果は次のとおりです。

0 2 4 
0 0 2 0 4 

(2番目の結果は、自分の足での良いショット、または意図したものである可能性があります)

于 2013-09-27T13:39:21.390 に答える