c++在for循环中初始化两个不同的迭代器
c++ Initialising 2 different iterators in a for loop
可能重复:
在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)]
您可以用first
和second
作为迭代器类型来声明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);
}
相关文章:
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 在C++中,是否可以在单个循环中顺序迭代多个迭代器
- 如何复制只有两个迭代器的数据?
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- C++从两个迭代器创建列表对
- 如何定义模板函数,该功能在C 中占用两个迭代器
- 如何获取两个迭代器之间的元素总数
- 给定同一数据结构的两个迭代器,如何检查哪个迭代器在另一个之前
- 如何在VS2013上比较两个迭代器进行单元测试
- 具有两个迭代器的循环排列
- 在两个迭代器之间获取“std::string”的子字符串
- 比较模板函数中不同类型的两个迭代器
- 为什么两个迭代器在循环中移位
- 测试两个迭代器是否来自同一对象
- 如果没有for循环,我如何直接找到映射中指向两个不同键的任何两个迭代器之间的元素数量
- 在多映射中,当两个迭代器持有具有映射到不同Value的相同键的值时.我们如何才能在地图上找到它们中的哪一个在另一个之前
- 有没有人有STL算法的包装器,将一个容器而不是两个迭代器作为第一个参数
- 两个迭代器之间有多少个元素
- 交换容器中两个迭代器的位置
- 接受两个迭代器的模板