如何在标准迭代器中使用`boost :: range`迭代器

Ana*_*and 5 c++ boost iterator std boost-range

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

typedef std::vector<Point> Points;

Points ConvexHull(Points::const_iterator first, Points::const_iterator last);
Run Code Online (Sandbox Code Playgroud)

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

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

例如,我找不到之间的区别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
Run Code Online (Sandbox Code Playgroud)

Cal*_*eth 1

您应该强烈考虑使用模板。这样做可以让编译器保留有关实际发生的操作的有用信息,这极大地帮助它生成优化的输出。约定std::是为所需概念命名类型参数。例如

template< class BidirIt, class UnaryPredicate > // anything bidirectional (which includes random access)
BidirIt std::partition( BidirIt first, BidirIt last, UnaryPredicate p );
Run Code Online (Sandbox Code Playgroud)

如果您确实不需要模板,您仍然不应该在detail命名空间中命名任何内容。就像是

#include <boost/range/any_range.hpp>

using PointRange = boost::any_range<Point, boost::random_access_traversal_tag>; // or another traversal tag.
using PointIterator = PointRange::iterator;
Run Code Online (Sandbox Code Playgroud)

您可能需要通过PointRange & 的频率低于,例如,int *&。几乎总是按值传递是正确的行为。复制它很便宜,因为它包含一个begin来自其构造范围的end迭代器,仅此而已。