2011-01-21 16 views
1

私はこのように2つのベクトルv1とv2を追加するプログラムを持っています:v1 + = v2。各反復でv2がv1に追加されます。次のプログラムを考えてみましょう:ベクターの変な振る舞い?

#include <iostream> 
    #include <vector> 
    #include <iterator> 

    using namespace std; 

    typedef vector<double> v_t; 

    int main(){ 

    v_t v1; 
    v_t v2; 

    for (int i = 1; i<10; i++){ 
     v1.push_back(i); 
     v2.push_back(i); 
     if (i == 5){   // Just want to insert a 0 inbetween 
     v1.push_back(0); 
     v2.push_back(0); 
     } 
    } 

// v1 : 1 2 3 4 5 0 6 7 8 9 
// v2 : 1 2 3 4 5 0 6 7 8 9 

    v_t::iterator it2(v2.begin()); 
     for(v_t::iterator it(v1.begin()), end(v1.end()); it != end;) 
     *(it++) += *(it2++); 

    copy(v1.begin(), v1.end(), ostream_iterator<double>(cout, " ")); 
     cout << endl; 
    } 

プログラムの出力は次のとおりです。

2 4 6 8 10 0 12 14 16 18 // This is correct and what I need 

が、私はこのようなループのために変更した場合:

. 
. 
. 
v_t::iterator it2(v2.begin()); 
    for(v_t::iterator it(v1.begin()), end(v1.end()); it != end && (*(it++) += *(it2++));); 

copy(v1.begin(), v1.end(), ostream_iterator<double>(cout, " ")); 
     cout << endl; 
    } 

今出力は次のとおりです。

2 4 6 8 10 0 6 7 8 9 

つまり、encounn両方のベクトルの同じ場所に0を加算すると、加算が停止します。どうして ? 0以上にはベクトルの終わりはありませんか?それはまた価値です。

私の質問のタイトルが意味をなさないと感じる場合は、自由に編集してください。

答えて

3

。したがって、6番目の要素(0)にヒットすると、0に評価され、条件it != end && (*(it++) += *(it2++));に失敗し、ループが終了します。

for(v_t::iterator it(v1.begin()), end(v1.end()); it != end && (*(it++) += *(it2++)););

は次のようになります。

it != end && (*(it++) += *(it2++)) 

彼らは両方ともゼロに等しい、条件:

for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; (*(it++) += *(it2++)));

1

forループの条件はit != end && *(it++) += *(it2++)です。 *it*it2の両方が0の場合、*(it++) += *(it2++)は0と評価されるため、条件はfalseでループは終了します。

むしろの条件部でこれを置くよりもあなたのための文あなたは空のまま最後の部分にそれを置く必要があります:あなたはループの終了条件として(*(it++) += *(it2++))をチェックしているためだ

for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; *(it++) += *(it2++)) 
0

は、それが原因であなたのループの条件部の停止されましたfalseに評価します。

1

後者の場合、forループの条件には、式*(it++) += *(it2++)が含まれています。

両方のイテレータが0を参照する場合、この式の値は0になります。これはfalseで、ループが終了します。

なぜループの状態で副作用として追加していますか?

2

*これと* IT2の両方がゼロであるとき

(*(it++) += *(it2++)); 

の結果がゼロであるからです。そして、ゼロはCでは偽である(C++であるので)。

方法によって、演算子を増分し、ベクトル内の実際の作業を分けるようにしてください。このような扱いにくいことをするためにコードを非常に乱雑にします(それはあなたには良いプログラマーにはならない);

+0

+1 from myself :) –