[英]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.