繁体   English   中英

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

[英]How to use `boost::range` iterators with standard iterators

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

typedef std::vector<Point> Points;

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

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

我试着看一下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

为此具有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;

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

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

如果您确实不希望使用模板,则仍不应在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;

您可能需要传递PointRange & 频率要比int *&传递频率低。 正确的行为几乎总是伴随着价值。 复制很便宜,因为它拥有构造它的Rangebeginend迭代器,仅此而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM