问题标签 [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.
c++ - 如何将 `boost::range` 迭代器与标准迭代器一起使用
我有接受std::vector
迭代器的函数,如
我通常将std
迭代器传递给他们,但有时我需要使用boost
迭代器,例如boost::join
'范围迭代器。我应该如何更改我的函数的参数化,理想情况下没有模板,以便它们接受两个迭代器?此外,我如何在每种类型中指明我需要哪些迭代器概念?
我尝试查看boost::range
文档,但这对我来说非常混乱,我不知道从哪里开始。
例如,我找不到 and 之间的区别boost::range_details::any_forward_iterator_interface
,boost::range_details::any_forward_iterator_wrapper
以及我是否应该使用其中任何一个来指定我需要一个前向迭代器。
编辑:
如果我使用boost::any_range
,如何传递非常量左值引用?
例如:
c++ - 声明`const``boost::range`s的正确方法
使用时boost::any_range
,指定不应修改底层容器(如果有)的正确方法是什么?
例如,使用别名
声明一个不能修改底层容器或“数据源”内容的范围,应该声明为
或作为
?
我怀疑第一个版本是正确的。但是const
,例如,如果我应用任何boost::adaptors
?
编辑
从文档中,显然元函数通过用而不是声明范围来range_iterator
“推断”const
底层容器的特性。即是(如果底层容器有这样的成员类型),而不是,所以容器不能通过这个迭代器进行修改。const T
T
range_iterator::<const T>::type
const_iterator
iterator
这是否意味着Range<const T>
也用于const_iterators
遍历范围?
c++11 - 通过 boost::any_range 随机访问 boost::transformed_range
我试图boost::any_range
在一些遗留代码中使用(带有随机访问标签),但发现它不喜欢 lambdas。编译错误似乎抱怨缺少 lambda 对象的默认构造函数。这是预期的行为吗?是设计使然吗?我在 MSVC C++17 上使用 boost 版本 1.66。
文档提到transformed_range与输入范围具有相同的类别:
问题显然出在某个地方boost::any_range
,因为如果我只使用 auto,它就可以工作(参见rngneg_auto
下文)
对于前两种情况,程序打印
第三是编译错误(我认为这是因为 lambdas 不是默认可构造的):
c++ - 转换函数按值返回时 boost::adaptors::transformed 的意外行为
考虑以下 C++11 代码,它是我能想到的最小的复制器:
我希望它打印以下输出:
...但它会打印(参见http://cpp.sh/8yivt):
但是,如果我更改myTransform
为返回这样的引用:
...然后我得到预期的输出(参见http://cpp.sh/5brvl)。
我无法从Boost.Range 文档中找到对此行为的任何解释。我的代码不正确吗?我的期望不正确吗?这是 Boost.Range 中的错误/已知限制吗?
这个问题的目的首先是要了解为什么它会以意想不到的方式表现,并且只是偶然地找到解决方案。
c++ - 与 BOOST Range 的接口
动机与方法
我正在编写一个小型库,它提供了一个 AST 结构和一些算法来导航它。简单来说,AST 的结构如下:
我想将算法定义为:
因此 AST 分支和分支部分(在算法中)的主要表示形式包含在 boost::range-s 中。因此,所有函数也都返回范围。
例子
我为什么要问的主要问题是转换问题。这是我正在尝试做的简短示例:
问题
为了保持所有函数的一致性,我应该在我的库中使用什么类型的 boost::ranges。是否可以像 boost::range 算法那样将任何范围类型转换为某种通用类型(我猜)?
提前致谢!
c++ - boost::adaptors::transformed 用于没有 const begin/end 的类
我正在尝试将对象传递给boost::adaptors::transformed
. 但是,这似乎只有在该对象的类定义了和的const
版本时才有效。然而,这对我来说不是这样,因为迭代这个类的对象会修改对象本身的内部状态。这是一个使用仅公开非 const 版本和/或它的成员的虚拟类的最小示例,我可以更改什么来使其工作?begin
end
Vector
begin
end
_v
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'
您可以在下面找到相关的代码片段:
- 这就是我要调用的函数,但在编译过程中失败了:
不知何故,这是可行的,但这并不是很干净:
- 这是应返回的 HandleRange 类型:
- 使用的 Handle 对象:
感谢您的任何建议!
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”,这是我能想到的大多数其他解决方案。
c++ - 条件提升::range::join
我想写一个这样的函数:
可能吗?我应该使用哪种类型而不是IteratorRangeType
?据我了解,boost::range::join
返回类型取决于它的参数。是否有一些包装类可以分配任何类型的范围,只要其基础值类型相同?