如何使用标准迭代器使用`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
的范围迭代器。理想情况下,我应该如何更改功能的参数化,以便他们接受两个迭代器?此外,如何在每种类型中指出我需要的迭代概念?
我尝试查看boost::range
文档,但这对我来说是压倒性的,我不知道从哪里开始。
例如,我找不到boost::range_details::any_forward_iterator_interface
和boost::range_details::any_forward_iterator_wrapper
之间的区别,以及我是否应该使用其中任何一个来指定我需要一个前进迭代器。
编辑:
如果我使用boost::any_range
,我该如何通过非const lvalue参考?
例如:
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
Boost-range为此目的具有any_range
,并且适合您的情况。
https://www.boost.org/doc/libs/1_60_0/libs/range/doc/html/range/Range/RANGE/RANGE/ranges/ranges/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;
您可能需要比int *&
少的PointRange &
。几乎总是按价值传递是正确的行为。复制价格便宜,因为它拥有begin
和end
迭代器的 range ,而仅此而已。
- Boost Spirit,获取迭代器内部语义动作
- 插入 boost::multi_index 后迭代器变得无效?
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- 将迭代器作为 3 个元素的滑动窗口,可以超调边界(可能使用 Boost)
- 如何使equal_range迭代器在 Boost 多索引中按不同的索引排序?
- Qi::p arse Boost Change开始迭代器
- BOOST矩阵的迭代器1和迭代器2是什么,以及如何使用
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 根据 boost::iterator_facade 定义基于代理的输出迭代器
- 如何使用标准迭代器使用`boost :: range`迭代器
- Cygwin目录迭代器中的Boost文件系统
- boost::iterator_adaptor 的遍历类别是否由适配迭代器的类别决定
- Boost Asio udp 解析器返回错误的端点迭代器
- 将迭代器映射到特定字段上的迭代器(可以使用 Boost)
- 存储Boost Multi_index索引迭代器
- 如何从boost :: spirit :: multi_pass获得基础迭代器
- 为什么 Boost.Range is_sorted不需要前向迭代器?
- boost :: iterator_range从模板的迭代器中
- 从boost :: multi_index的迭代器中推导标签
- 寻找Boost转换迭代器的复合特征模式