C++使用 for 循环迭代 2 个向量
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
循环的第一部分是普通声明,就像上面的声明一样,您在一行中声明和定义多个向量。仅写入一次类型:
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 (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();
您应该改用逻辑和运算符来确保循环将在任一条件为 false 时立即终止:
it1 != x.end() && it2!=d.end();
一种替代方法,而不是使用 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 循环更具表现力。
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 如何取消引用向量迭代器
- Map中的(字符串的)向量迭代器
- C++将向量迭代器转换为索引
- yaml-cpp到std::向量迭代的怪异行为
- 使用索引与迭代器将向量迭代到倒数第二个元素
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++向量迭代器nth_element编译错误
- 无法查找值初始化的向量迭代器?
- C++向量迭代:常量 vs. 常量自动 vs. 无常量
- 向量迭代编译为非常不同的指令
- STD ::向量迭代器类型和允许的操作
- 如何通过尺寸未知的2D向量迭代
- 向量迭代器 < 或 !=
- 如何通过共享_ptr向量迭代
- 如何通过向量迭代作为指针
- 通过向量迭代,而其他线程可能会对其进行修改
- 我如何通过C 中的字符串向量迭代
- 向量迭代器在新对象的 push_back() 之后不兼容