问题标签 [boost-range]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1277 浏览

c++ - 如何将 `boost::range` 迭代器与标准迭代器一起使用

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

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

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

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


编辑:

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

例如:

0 投票
1 回答
93 浏览

c++ - 声明`const``boost::range`s的正确方法

使用时boost::any_range,指定不应修改底层容器(如果有)的正确方法是什么?

例如,使用别名

声明一个不能修改底层容器或“数据源”内容的范围,应该声明为

或作为

?

我怀疑第一个版本是正确的。但是const,例如,如果我应用任何boost::adaptors?


编辑

文档中,显然元函数通过用而不是声明范围来range_iterator“推断”const底层容器的特性。即是(如果底层容器有这样的成员类型),而不是,所以容器不能通过这个迭代器进行修改。const TTrange_iterator::<const T>::typeconst_iteratoriterator

这是否意味着Range<const T>也用于const_iterators遍历范围?

0 投票
2 回答
148 浏览

c++ - 为什么 `boost::lower_bound` 按值取参数?

boost::lower_boundRange 2.0 中(在此处找到)的实现按值获取其参数。

为什么是这样? std::lower_bound通过 const ref 接受它的论点 - 见这里

0 投票
1 回答
128 浏览

c++11 - 通过 boost::any_range 随机访问 boost::transformed_range

我试图boost::any_range在一些遗留代码中使用(带有随机访问标签),但发现它不喜欢 lambdas。编译错误似乎抱怨缺少 lambda 对象的默认构造函数。这是预期的行为吗?是设计使然吗?我在 MSVC C++17 上使用 boost 版本 1.66。

文档提到transformed_range与输入范围具有相同的类别:

https://www.boost.org/doc/libs/1_66_0/libs/range/doc/html/range/reference/adaptors/reference/transformed.html

问题显然出在某个地方boost::any_range,因为如果我只使用 auto,它就可以工作(参见rngneg_auto下文)

对于前两种情况,程序打印

第三是编译错误(我认为这是因为 lambdas 不是默认可构造的):

0 投票
0 回答
89 浏览

c++ - 转换函数按值返回时 boost::adaptors::transformed 的意外行为

考虑以下 C++11 代码,它是我能想到的最小的复制器:

我希望它打印以下输出:

...但它会打印(参见http://cpp.sh/8yivt):

但是,如果我更改myTransform为返回这样的引用:

...然后我得到预期的输出(参见http://cpp.sh/5brvl)。

我无法从Boost.Range 文档中找到对此行为的任何解释。我的代码不正确吗?我的期望不正确吗?这是 Boost.Range 中的错误/已知限制吗?

这个问题的目的首先是要了解为什么它会以意想不到的方式表现,并且只是偶然地找到解决方案。

0 投票
1 回答
93 浏览

c++ - 与 BOOST Range 的接口

动机与方法

我正在编写一个小型库,它提供了一个 AST 结构和一些算法来导航它。简单来说,AST 的结构如下:

我想将算法定义为:

因此 AST 分支和分支部分(在算法中)的主要表示形式包含在 boost::range-s 中。因此,所有函数也都返回范围。


例子

我为什么要问的主要问题是转换问题。这是我正在尝试做的简短示例:

问题

为了保持所有函数的一致性,我应该在我的库中使用什么类型的 boost::ranges。是否可以像 boost::range 算法那样将任何范围类型转换为某种通用类型(我猜)?

提前致谢!

0 投票
1 回答
53 浏览

c++ - boost::adaptors::transformed 用于没有 const begin/end 的类

我正在尝试将对象传递给boost::adaptors::transformed. 但是,这似乎只有在该对象的类定义了和的const版本时才有效。然而,这对我来说不是这样,因为迭代这个类的对象会修改对象本身的内部状态。这是一个使用仅公开非 const 版本和/或它的成员的虚拟类的最小示例,我可以更改什么来使其工作?beginendVectorbeginend_v

0 投票
1 回答
137 浏览

c++ - 如何将单个对象转换为 boost::any_range?

我正在尝试创建并返回一个 boost:any_range 只包含一个对象(我不知道这是否是核心问题),但我收到以下错误:

  • 错误 C2893:无法专门化函数模板 'range_iterator<C,void>::type boost::range_adl_barrier::begin(T &)'
  • 注意:使用以下模板参数:
  • 注意:'T=const WrappedRange'
  • 错误 C2672:“结束”:未找到匹配的重载函数
  • 错误 C2893:无法专门化函数模板
    'range_iterator<C,void>::type boost::range_adl_barrier::end(T &)'
  • 注意:使用以下模板参数:注意:'T=const
    WrappedRange'

您可以在下面找到相关的代码片段:

  1. 这就是我要调用的函数,但在编译过程中失败了:

不知何故,这是可行的,但这并不是很干净:

  1. 这是应返回的 HandleRange 类型:
  1. 使用的 Handle 对象:

感谢您的任何建议!

0 投票
1 回答
73 浏览

c++ - 为什么我不能在基于范围的循环之外使用 boost::adaptor::map_values?

我想使用 boost'sboost::adaptor::map_values来构造 a 的所有值的向量std::map。拿这个示例代码(或在 Godbolt 试试)

海合会抱怨:

我能找到的所有示例和所有文档都只在接受范围的语句(如基于范围的 for 循环或 )中使用 boost 适配器,而不是在需要像构造boost::copy函数这样的迭代器对的语句中。std::vector

根据 GCC,这里的问题map_values是不适用于std::map<int, int>. 但是,这实际上是 docs 给出的唯一示例,所以我很确定这std::map<int, int>对于map_values.

这里有什么问题?

PS:我知道有无数其他方法可以从地图的值中优雅地构造一个向量。我想知道为什么这段代码不起作用。此外,这种方法具有保证 RVO 的额外好处,而不是“可能是 NRVO”,这是我能想到的大多数其他解决方案。

0 投票
1 回答
29 浏览

c++ - 条件提升::range::join

我想写一个这样的函数:

可能吗?我应该使用哪种类型而不是IteratorRangeType?据我了解,boost::range::join返回类型取决于它的参数。是否有一些包装类可以分配任何类型的范围,只要其基础值类型相同?