问题标签 [boost-adaptors]
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 适配器放在一个适配器链的末尾以创建一个集合,如下所示:
使用方法 3.1我编写了下面的代码,它似乎按预期工作:
但是如果我取消注释那一行,我会得到:
错误 C2338:C++ 标准禁止 const 元素的容器,因为分配器格式错误。
如果我将第一个参数设置operator|
为&&
,那么直到我取消注释该filtered()
行,然后我得到:
错误 C2825:“R”:后跟“::”时必须是类或命名空间
这样做的正确方法是什么?
c++ - 在 boost transform() 之后比较嵌套的迭代器
如果我使用 VS2015 运行此程序_ITERATOR_DEBUG_LEVEL=2
,则会在以下位置触发此错误_Compat(const _Myiter& _Right)
:
这很重要,因为展平迭代器在advance_past_empty_inner_containers()
.
这是怎么回事?我如何解决它?
c++ - 实现 Boost 范围适配器 reversed_if
我经常在我的代码中遇到这样的情况,我想根据运行时条件以直接或相反的顺序迭代一个范围。这通常会导致如下代码
或者
其中包含代码重复(第一个)或效率低下(第二个)。
我一直在思考一个假设的 Boost 范围适配器,它可以有条件地反转一个范围,这样我就可以写
我可以自己实现它(从这里开始),但我不确定如何进行。为了支持运行时条件,恐怕我必须在每次迭代时检查一个布尔值以确定迭代方向或使用虚拟性来调度迭代代码。这就是Boost范围适配器中未提供此功能的原因吗?
任何替代解决方案?
c++ - c++ boost range adapter 多个向量
当我必须对向量执行转换/函数时,我最近才开始在 boost 中使用范围适配器。下面是我开始使用范围适配器时遇到的最简单示例之一的片段。
如果我的函数需要两个参数而不是一个参数怎么办,有什么方法可以将两个向量传递给范围适配器?例如,在这种情况下:
我仍然可以通过范围适配器将两个向量num1
和我的函数传输到我的函数中吗?num2
也许是这样的:
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++11 - 关于 Lambda 与 boost::adaptors::filtered() 一起使用的两个问题
请考虑这个非编译代码:
编译因此错误而死:
1.) 如何将该函数参数带入我的 lambda?
2.) 这是一种危险的方法吗?我应该改用 std::remove_copy_if() 吗?
- 我不担心“get_all_stuff()”返回的向量的生命周期。
- 我担心“get_some_stuff()”返回的向量的生命周期。
c++ - 了解基于惰性范围的函数的组成
TL;博士
下面最后一行注释的行有什么问题?
或者,换句话说,是什么让管道v | indexed(0)
成为transformed(complex_keep_index)
定义明确的,但管道v | indexed(0) | transformed(complex_keep_index)
成为transformed(distribute)
未定义的行为?
扩大的视野
我有一个装东西的容器,
我有一个函数可以从这些东西中生成另一个容器,
所以如果我申请complex_comput
to v
,我会得到,
如果我还要连接结果,我最终会得到这个:
但是,我想跟踪每个数字来自的索引,结果将编码如下:
为了做到这一点,我(最终)想出了这个解决方案,我试图利用 Boost. 具体来说,我执行以下操作:
- 用于
boost::adaptors::indexed
将索引附加到v
- 将每个结果“对”转换为
std::pair
存储应用程序的index
结果和结果,complex_comput
value
- 最后将每个转换
std::pair<st::vector<int>,int>
为std::vector<std::pair<int,int>>
.
但是,我不得不放弃 2 到 3 之间的范围,std::vector
在两个转换之间使用辅助函数“true”。
实际上,对定义和使用的行进行注释可以z
为您提供一个可以编译但生成垃圾结果的代码,即未定义的行为。请注意,应用copy_range<type_of_temp>
到第一个工作范围是必要的,否则生成的代码本质上与 . 右侧的代码相同auto z =
。
为什么我必须这样做?导致oneliner无法工作的细节是什么?
我部分理解了原因,我将在下面列出我的理解/想法,但我提出这个问题是为了彻底解释所有细节。
- 我知道我观察到的未定义行为源于
z
一个范围,该范围定义了一些已被破坏的临时视图; - 鉴于代码的工作版本,很明显临时是
v | indexed(0) | transformed(complex_keep_index)
; - 然而,它
v | indexed(0)
本身不是一个被喂食的临时物transformed(complex_keep_index)
吗? - 一个重要的细节可能是该表达式
v | indexed(0)
只不过是一个惰性范围,它不计算任何内容,但只是设置了一些东西,以便在迭代范围时完成计算;毕竟我可以很容易地做到v | indexed(0) | indexed(0) | indexed(0)
,这是明确的; - 而且整个
v | indexed(0) | transformed(complex_keep_index)
定义都很好,否则上面使用的代码w
可能会行为不端(我知道 UB 并不意味着结果必须显示有问题,此时在这个硬件上看起来一切正常,并且明天休息)。 transformed(distribute)
因此,将右值传递给;本质上是错误的。- 但是这样做的错误在于
distribute
,而不是transformed
,因为例如更改distribute
为[](auto x){ return x; }
似乎已明确定义。 - 那么有什么问题
distribute
呢?这是代码
- 它有什么问题?返回的范围( this 的输出
transformed
)将包含一些迭代器/指针/引用,这些迭代器/指针/引用在返回pair.first
时超出了范围distribute
,但pair
它是对调用者中某些东西的引用,它一直存在,对吧? - 但是我知道,即使
const
引用(例如pair
)可以使临时(例如 的元素v | indexed(0) | transformed(complex_keep_index)
)保持活动状态,但这并不意味着当该引用超出范围时临时保持活动状态只是因为它又被其他东西引用(输出中的引用/指针/迭代器transformed([n = …](…){ … })
)不会超出范围。
我认为/希望答案可能已经在我上面写的内容中,但是我需要一些帮助来简化所有这些,以便我可以一劳永逸地理解它。
c++ - 连接多个范围而不复制
我想将多个范围(eqvectors)连接到一个范围内,而不是将它们复制到新容器中,这样性能会更好。
它用于稍后在整个范围内进行迭代。
上面打印了这个;
但我真正想要的是这个;
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”,这是我能想到的大多数其他解决方案。