首页 > 解决方案 > 如何将 `boost::range` 迭代器与标准迭代器一起使用

问题描述

我有接受std::vector迭代器的函数,如

typedef std::vector<Point> Points;

Points ConvexHull(Points::const_iterator first, Points::const_iterator last);

我通常将std迭代器传递给他们,但有时我需要使用boost迭代器,例如boost::join'范围迭代器。我应该如何更改我的函数的参数化,理想情况下没有模板,以便它们接受两个迭代器?此外,我如何在每种类型中指明我需要哪些迭代器概念?

我尝试查看boost::range文档,但这对我来说非常混乱,我不知道从哪里开始。

例如,我找不到 and 之间的区别boost::range_details::any_forward_iterator_interfaceboost::range_details::any_forward_iterator_wrapper以及我是否应该使用其中任何一个来指定我需要一个前向迭代器。


编辑:

如果我使用boost::any_range,如何传递非常量左值引用?

例如:

template<typename T>
using Range = boost::any_range<T, boost::random_access_traversal_tag, 
                               T, std::ptrdiff_t>;


f(Range<Point> &points);  // defined elsewhere

// -------------

vector<Point> vec;
f(vec);  // error; cannot bind non-const lvalue reference to unrelated type

标签: c++boostiteratorstdboost-range

解决方案


用于any_range此目的,它适合您的情况。

https://www.boost.org/doc/libs/1_60_0/libs/range/doc/html/range/reference/ranges/any_range.html

从您的示例来看,它看起来像这样:

#include <boost/range/any_range.hpp>

typedef boost::any_range<Point,
                         boost::bidirectional_traversal_tag,
                         Point,
                         std::ptrdiff_t
                        > PointRange;

推荐阅读