[英]C++ iterating over 2 vectors using for loop
我正在尝试使用for循环迭代2个std::vectors
,但出现错误。 迭代1个向量有效,不知道在for
循环中放置另一个迭代器时出了什么问题。
#include<iostream>
#include<vector>
int main()
{
std::vector<double> x={1,2,3,4,5}, d={10,11,12,13,14},x1,x2;
/*for (std::vector<double>::iterator it1 = x.begin(),std::vector<double>::iterator it2 = d.begin();
it1!=x.end(),it2!=d.end(); ++it1,++it2 )
{
x1.push_back(*it1 + (*it2));
x2.push_back(*it1 + (*it2));
}*/
for (std::vector<double>::iterator it1 = x.begin();it1!=x.end(); ++it1 )
{
x1.push_back(*it1 );
}
return 0;
}
已注释掉的代码有多个错误: qualified-id in declaration before 'it2' for (std::vector<double>::iterator it1 = x.begin(),std::vector<double>::iterator it2 = d.begin());
有人可以解释这里有什么问题吗?
使用逗号( ,
)声明多个变量时,只需指定一次类型。 更改此:
for (std::vector<double>::iterator it1 = x.begin(), std::vector<double>::iterator it2 = d.begin();
对此:
for (std::vector<double>::iterator it1 = x.begin(), it2 = d.begin();
或更好-由于您使用的是c++11
,请使用auto
:
for (auto it1 = x.begin(), it2 = d.begin();
这样可以消除编译器错误,但是这里仍然有一个逻辑错误:
it1!=x.end(),it2!=d.end(); ++it1,++it2 )
您正在丢弃it1!=x.end()
。 在表达式中, 逗号运算符会评估每个表达式,但只会对最后一个表达式求值。 将,
更改为&&
,如下所示:
it1!=x.end() && it2!=d.end(); ++it1,++it2 )
而且你很好。
您在for循环中的定义中有错误。 定义变量时,不能使用逗号运算符提供多种类型。 即这是错误的:
std::vector<double>::iterator it1 = x.begin(), std::vector<double>::iterator it2 = d.begin();
要更正此问题,请注意,迭代器的类型相同,因此您可以编写:
std::vector<double>::iterator it1 = x.begin(), it2 = d.begin();
测试条件不正确。 在这里,逗号运算符执行第一个测试,但随后忽略结果。 即,这在逻辑上是不正确的:
it1 != x.end(), it2 != d.end();
相反,您应该使用逻辑和运算符来确保一旦任一条件为假,循环就会终止:
it1 != x.end() && it2!=d.end();
for
循环的第一部分是普通声明,就像上面的声明和在一行中定义多个向量一样。 只写一次类型:
for (std::vector<double>::iterator it1 = x.begin(), it2 = d.begin();
it1!=x.end() && it2!=d.end();
++it1, ++it2)
{
x1.push_back(*it1 + (*it2));
x2.push_back(*it1 + (*it2));
}
您还可以在循环条件的错误:使用&&
代替,
因为否则这是一个逗号操作,其结果是只有最后一部分。
最后,如今习惯上使用auto
而不是写出这些长类型:
for (auto it1 = x.begin(), it2 = d.begin();
it1 != x.end() && it2 != d.end();
++it1, ++it2)
{
x1.push_back(*it1 + (*it2));
x2.push_back(*it1 + (*it2));
}
一种替代方法,而不是使用for循环。 这样做不是那么容易:
#include <vector>
#include <algorithm>
#include <numeric>
#include <iostream>
template<typename T>
void printVector(const std::vector<T>& vec) {
for (auto& v : vec)
std::cout << v << ' ';
std::cout << '\n';
}
int main() {
std::vector<double> x{ 1,2,3,4,5 }, d{ 10,11,12,13,14 },
x1( x.size(), 0 ), x2( x.size(), 0 );
std::transform(x.begin(), x.end(), d.begin(), x1.begin(), std::plus<double>());
std::transform(x.begin(), x.end(), d.begin(), x2.begin(), std::plus<double>());
printVector(x);
printVector(d);
printVector(x1);
printVector(x2);
return 0;
}
它给了我这个输出:
1 2 3 4 5
10 11 12 13 14
11 13 15 17 19
11 13 15 17 19
因为这似乎是您要使用两个向量实现的目标。 我还认为这看起来更清晰,可读性更好。 恕我直言,我相信这比for循环更具表现力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.