c++在for循环中初始化两个不同的迭代器

c++ Initialising 2 different iterators in a for loop

本文关键字:两个 迭代器 for 循环 初始化 c++      更新时间:2023-10-16

可能重复:
在for循环的初始化中,我可以声明不同类型的变量吗?

我想在c++中有一个for循环,它在初始化中构造两种不同类型的向量迭代器。

以下是我想要的大致想法:

std::vector<double> dubVec;
std::vector<int> intVec;
double result = 0;
dubVec.push_back(3.14);
intVec.push_back(1);
typedef std::vector<int>::iterator intIter;
typedef std::vector<double>::iterator dubIter;
for (intIter i = intVec.begin(), dubIter j = dubVec.begin(); i != intVec.end(); ++i, ++j)
{
  result += (*i) * (*j);
}

有人知道这种情况下的标准是什么吗?我不能仅仅用二重向量来表示intVec,因为我正在寻找一个通用的解。[即,我可能有一些函数f,它将int加倍,然后计算f(*i)*(*j)]

您可以用firstsecond作为迭代器类型来声明std::pair

for (std::pair<intIter, dubIter> i(intVec.begin(), dubVec.begin());
     i.first != intVec.end() /* && i.second != dubVec.end() */;
     ++i.first, ++i.second)
{
    result += (*i.first) * (*i.second);
}

不能在for循环中声明不同类型的变量。

只需在外面申报即可:

intIter i = intVec.begin();
dubIter j = dubVec.begin();
for (; i != intVec.end(); ++i && ++j)
{
}

查看zip迭代器。它完全符合您的要求:同时对两个或多个序列进行并行迭代。使用它,我会把它写为:

using namespace boost;
for (auto i=make_zip_iterator(make_tuple(dubVec.begin(), intVec.begin())),
          ie=make_zip_iterator(make_tuple(dubVec.end(), intVec.end()));
          i!=ie; ++i)
{
  // ...
}

诚然,如果您在特定情况下不支持auto或其他类型推理,那么这个get会稍微复杂一些,但使用typedef仍然可以很好。

例如

intIter i = intVec.begin();
dubIter j = dubVec.begin();
for (; i != intVec.end(); ++i && ++j)
{
  result += (*i) * (*j);
}

只能在for中声明几个相同类型的var。你确定这部分吗

++i && ++j

我相信你想在那里写

 ++i, ++j

很明显,您必须阅读C++中for循环的基础知识

以扩大迭代器的范围为代价,最简单的方法就是将它们提升到包含范围:

intIter i;
dubIter j;
for (i = intVec.begin(), j = dubVec.begin(); i != intVec.end(); ++i && ++j)
{
    result += (*i) * (*j);
}

不要把事情搞得过于复杂。

for( size_t i = 0; i < intVec.size(); ++i )
{
    result += intVec[i] * dubVec[i];
}

您似乎需要一个inner_product算法。

#include <vector>
#include <functional>
#include <numeric>
#include <iostream>
struct my_plus 
{
    double operator()(int i, double d)
    {
        return d + i;
    }
};
struct my_multiplies 
{
    double operator()(int i, double d)
    {
        return d * i;
    }
};
int main()
{
    std::vector<double> dubVec;
    std::vector<int> intVec;
    double result = 0;
    dubVec.push_back(3.14);
    intVec.push_back(1);
    result = std::inner_product(intVec.begin(), 
                                intVec.end(), 
                                dubVec.begin(),
                                0.0,
                                my_plus(),
                                my_multiplies());
    std::cout << result << std::endl;
}

我使用了自己的函子,因为我怀疑标准的乘法和加号期望两个操作数的类型相似,但我可能错了。

intIter i;
dubIter j;
for (i = intVec.begin(), j = dubVec.begin(); i != intVec.end() && j != dubIter.end(); ++i, ++j)
{
    result += (*i) * (*j);
}