2011-01-21 69 views
1

我有一个程序,只是像这样添加两个向量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 

,但如果我修改for循环是这样的:

. 
. 
. 
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 

即每当遇到ters 0在它停止添加的两个向量中的相同位置。为什么?超过0不会标记任何矢量的结束,是吗?这也是一种价值。

如果您觉得它没有意义,请随时编辑我的问题的标题。

回答

3

那是因为你正在检查(*(it++) += *(it2++))作为循环终止条件。所以当它碰到第六个元素时,它的值为零,其结果为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-loop的条件是it != end && *(it++) += *(it2++)。如果*it*it2都为0,则*(it++) += *(it2++)将评估为0,因此您的条件为假,并且循环退出。

而不是把这个中的条件部分你的语句,你应该把它放在最后一部分,你留空:

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

那是因为你的循环的条件部分停止评估为错误。

1

如果是后者,您的for循环的条件包括表达式*(it++) += *(it2++)

如果两个迭代器都引用一个0,则该表达式的值为0,这是false,从而导致循环终止。

为什么你在循环的条件下做附加作为副作用?

2

这是因为

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

结果为零,当两个*它和* IT2为零。在C中零是错误的(所以它是在C++中)。

通过这种方式,尝试分开递增操作符和执行向量中的实际工作。它使代码非常混乱,一起做这些棘手的事情(并且它不会让你成为更好的程序员;)

+0

+1 from myself :) – 2011-01-21 17:16:45