c++ - 如何将 `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_interface
,boost::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
解决方案
boost-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;
推荐阅读
- codeigniter - 如何使用 codeigniter 从多个输入上传文件
- asp.net - 这个错误的原因是什么 System.ArgumentException
- visual-studio - 是否有适用于 Visual Studio 2017 的智能 tpl 代码格式化程序?
- javascript - 将 php 的自动递增循环变量值传递给 jquery/javascript
- apache-camel - Camel + pollEnrich from bean
- r - 将 dplyr 子表检测为函数而不是表
- robotframework - RobotFrameWork:如何检查组件块顶行中的动态元素
- azure - 没有 /FileStore 和 /Users 的 Azure Databricks
- hibernate - Hibernate 在 logback 中显示没有时间戳格式的 sql 日志
- maven - 找不到 com.android.support:appcompat-v7:28.0.0