C++使用 for 循环迭代 2 个向量

C++ iterating over 2 vectors using for loop

本文关键字:向量 迭代 循环 使用 for C++      更新时间:2023-10-16

我正在尝试使用 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  )

你很好去。

  1. 在 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();
    
  2. 测试条件不正确。 在这里,逗号运算符执行第一个测试,但随后忽略结果。 这在逻辑上是不正确的:

    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 循环更具表现力。