使用迭代器作为偏移索引

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.

中的一个列表

非常感谢!

如果 v1v2 是自定义数据类型的实例,那么是的,这是可能的,因为您可以创建一个重载的 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 胡椒粉。