使用迭代器作为偏移索引

时间:2015-08-04 12:59:01

标签: c++ syntax listiterator

如果已经提出要求,请道歉。我找不到答案。 使用迭代器作为偏移索引是否合法? 例如:

for (list<T> iterator::it = v2->vals.begin(); it!=v2->vals.end();++i) {
    v3.push_back(v2[it] + v1[it]);
}

其中:const Vec&amp; V2 和vals是Vec类受保护的列表。

非常感谢!

3 个答案:

答案 0 :(得分:4)

您不能直接使用迭代器作为索引。

但是,如果你想在容器中使用迭代器“position”来获得你想要的索引,你可以使用std::distance来实现,即:

unsigned int index = std::distance(v2.begin(), it);
//if it was the fifth element, index's value is 4.

答案 1 :(得分:0)

如果v1v2是自定义数据类型的实例,那么它是可能的,因为您可以创建一个重载operator[]函数,它采用正确的迭代器作为参数的类型。

然而,它并不像你看起来那么容易,因为至少v2似乎是一个指针,所以你需要先取消引用它:

(*v2)[it]

或明确调用operator函数:

v2->operator[](it)

答案 2 :(得分:0)

对于多个容器的并行遍历,您可以使用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的胡椒化。