使用迭代器作为偏移索引
Using iterators as offset index
抱歉,如果有人问过这个问题。我找不到答案。
使用迭代器作为偏移索引是否合法?
例如:
for (list<T> iterator::it = v2->vals.begin(); it!=v2->vals.end();++i) {
v3.push_back(v2[it] + v1[it]);
}
其中:const Vec& v2
vals 是 Vec class's protected.
中的一个列表
非常感谢!
如果 v1
和 v2
是自定义数据类型的实例,那么是的,这是可能的,因为您可以创建一个重载的 operator[]
函数,它将正确的迭代器类型作为参数。
然而它并不像你看起来那么容易,因为至少 v2
似乎是一个 指针 ,所以你需要先取消引用它:
(*v2)[it]
或显式调用运算符函数:
v2->operator[](it)
不能直接使用迭代器作为索引。
但是,如果您确实想在其容器中使用迭代器 "position" 来获得您想要的索引,您可以使用 std::distance,即:
unsigned int index = std::distance(v2.begin(), it);
//if it was the fifth element, index's value is 4.
并行遍历多个容器,可以使用Boost.Iterator的Zip Iterator:
std::transform(
boost::make_zip_iterator(boost::make_tuple(begin(v1), begin(v2))),
boost::make_zip_iterator(boost::make_tuple( end(v1), end(v2))),
std::back_inserter(v3),
[](boost::tuple<int const &, int const&> const &p) {
return p.get<0>() + p.get<1>();
}
);
不过,诚然,我并不真正相信语法。恕我直言,这个库将受益于一些 C++11/14 胡椒粉。
抱歉,如果有人问过这个问题。我找不到答案。 使用迭代器作为偏移索引是否合法? 例如:
for (list<T> iterator::it = v2->vals.begin(); it!=v2->vals.end();++i) {
v3.push_back(v2[it] + v1[it]);
}
其中:const Vec& v2 vals 是 Vec class's protected.
中的一个列表非常感谢!
如果 v1
和 v2
是自定义数据类型的实例,那么是的,这是可能的,因为您可以创建一个重载的 operator[]
函数,它将正确的迭代器类型作为参数。
然而它并不像你看起来那么容易,因为至少 v2
似乎是一个 指针 ,所以你需要先取消引用它:
(*v2)[it]
或显式调用运算符函数:
v2->operator[](it)
不能直接使用迭代器作为索引。
但是,如果您确实想在其容器中使用迭代器 "position" 来获得您想要的索引,您可以使用 std::distance,即:
unsigned int index = std::distance(v2.begin(), it);
//if it was the fifth element, index's value is 4.
并行遍历多个容器,可以使用Boost.Iterator的Zip Iterator:
std::transform(
boost::make_zip_iterator(boost::make_tuple(begin(v1), begin(v2))),
boost::make_zip_iterator(boost::make_tuple( end(v1), end(v2))),
std::back_inserter(v3),
[](boost::tuple<int const &, int const&> const &p) {
return p.get<0>() + p.get<1>();
}
);
不过,诚然,我并不真正相信语法。恕我直言,这个库将受益于一些 C++11/14 胡椒粉。