我有一个程序只添加两个向量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
即。每当它在两个向量中的相同位置遇到0时它就会停止添加。为什么?超过0并不标记任何向量的结束,是吗?这也是一种价值。
如果您认为我的问题没有意义,请随时编辑我的问题标题。
答案 0 :(得分:3)
那是因为您正在检查( *(it++) += *(it2++) )
作为循环终止条件。所以当它到达第6个元素时,它会计算到零,这会使条件it != end && ( *(it++) += *(it2++) );
失败并终止循环。
for(v_t::iterator it(v1.begin()), end(v1.end()); it != end && ( *(it++) += *(it2++) ); );
应该是:
for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; ( *(it++) += *(it2++) ) );
答案 1 :(得分:2)
这是因为
的结果( *(it++) += *(it2++) );
当* it和* it2都为零时,为零。在C中零是错误的(因此它在C ++中)。
通过这种方式,尝试分离递增运算符并在向量中执行实际工作。它使代码非常混乱,一起做这些棘手的事情(并且它不会让你成为更好的程序员;)
答案 2 :(得分:1)
你的for循环条件是it != end && *(it++) += *(it2++)
。如果*it
和*it2
都为0,则*(it++) += *(it2++)
将评估为0,因此您的条件为false并且循环退出。
不要把它放在你的for语句的条件部分中,而应该把它放在你留空的最后一部分中:
for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; *(it++) += *(it2++))
答案 3 :(得分:1)
如果是后一种情况,你的for循环条件包含表达式*(it++) += *(it2++)
。
如果两个迭代器都引用了0,则此表达式将具有值0,该值为false,从而导致循环终止。
为什么在循环条件中将附加作为副作用?
答案 4 :(得分:0)
因为循环的条件部分而停止:
it != end && ( *(it++) += *(it2++) )
当它们都等于零时,条件的计算结果为假。