0

次のコードスニペットが異なる出力を提供するのはなぜですか?(以下の出力を参照)

スニペット1:

vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int>::const_iterator iterv1=v.begin();
vector<int>::const_iterator iterv2=v.begin();
for(;iterv1!=v.end();++iterv1){
    for(;iterv2!=v.end();++iterv2){
        cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
    }
}

Ouptut:

*iterv1 = 1 *iterv2 = 1
*iterv1 = 1 *iterv2 = 2

コードスニペット2:

vector<int> v;
v.push_back(1);
v.push_back(2);
for(int i=0;i<2;++i){
    for(int j=0;j<2;++j){
        cout << "v[i] = " << v[i] << " v[j] = " << v[j] << endl;
    }
}

出力:

v[i] = 1 v[j] = 1
v[i] = 1 v[j] = 2
v[i] = 2 v[j] = 1
v[i] = 2 v[j] = 2

私は同じことを期待していました(数値出力。明らかに、イテレータについて理解していないことがあります。誰かが助けてくれますか?

4

1 に答える 1

3

iterv2さて、内側のループで最初にリセットしません。初期化コードは、それが属する場所、つまり for-initialization に配置する必要があります。

for-initialization で割り当てを移動するだけです。

vector<int>::const_iterator iterv1;
vector<int>::const_iterator iterv2;
for(iterv1=v.begin();iterv1!=v.end();++iterv1){
    for(iterv2=v.begin();iterv2!=v.end();++iterv2){
        cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
    }
}

または、後で変数が必要ない場合は、変数をループ内に配置することもできます。

for(vector<int>::const_iterator iterv1=v.begin();iterv1!=v.end();++iterv1){
    for(vector<int>::const_iterator iterv2=v.begin();iterv2!=v.end();++iterv2){
        cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
    }
}

ちなみに、C++11 を使用する場合は、次の 2 つの新しい言語機能をauto利用できます。つまり、コンパイラは型を把握し、型を明示的に記述したのと同じ方法でコンパイルします):

for(auto iterv1=v.begin();iterv1!=v.end();++iterv1){
    for(auto iterv2=v.begin();iterv2!=v.end();++iterv2){
        cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
    }
}

また、範囲ベースの for ループの新しい構文 (Java のものと同様) により、書き込みと (はるかに重要な) 読み取りの両方がはるかに簡単になります。

for(auto iterv1 : v){
    for(auto iterv2 : v){
        cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
    }
}

PS インデックスベースのバージョンで初期化をループの外に移動した場合、同じエラーが発生します。

// WRONG - SAME ERROR
int i = 0;
int j = 0;
for(;i<2;++i){
    for(;j<2;++j){
        cout << "v[i] = " << v[i] << " v[j] = " << v[j] << endl;
    }
}

PP.S. 演算子の前後にスペースを追加して、コードを少し読みやすくします。ほとんどのコード スタイル ガイドラインでは、これが必要です。

于 2013-02-21T22:45:47.193 に答える