问题标签 [range-v3]
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++ - 如何使用 range-v3 获得集合的所有权?
我想从代表 STL 集合视图的函数中返回一个范围,如下所示:
但是,view::transform
不拥有所有权is
,所以当我运行它时,会有未定义的行为,因为在退出is
时被释放。createRange
如果我尝试std::move(is)
作为输入,我会得到一个静态断言,表明我不能使用右值引用作为 a 的输入view
。有什么方法可以确保视图拥有集合的所有权?
编辑:一些附加信息
我想添加一些澄清信息。我有一个数据流,data
我有一个将数据转换为结构的视图Foo
,看起来像这样:
我想要做的是std::pair<std::string, int>
通过在整个值中分配名称来创建一个范围。我天真的尝试看起来像这样:
但是,这会导致未定义的行为,因为values
已释放。我能够解决这个问题的唯一方法是制作values
astd::shared_ptr
并在传递给的 lambda 中捕获它view::transform
以保持它的生命周期。这似乎是一个不雅的解决方案。
我认为我正在寻找的是一个拥有源集合所有权的视图,但它看起来不像 range-v3 那样。
或者,我可以使用老式的 for 循环创建分布式版本,但这似乎不适用于view::join
:
即使这确实适用于view::join
,我也认为范围和循环的混合隐喻也是不雅的。
c++ - 使用 rangev3 在 C++ 中模拟 python 样式的列表理解?
使用 rangev3 库我可以做到这一点:
给我 1995 年 3 月的日期:
有没有办法以更接近 python 的语法来做到这一点:
特别是我觉得从日期/函数开始有助于代码的可读性。
c++ - 解释元组上的循环
在 range-v3 中,以下是 c++17 的合法代码。
我从来没有在auto [value, suit]
任何地方看到过这种语法,有人可以解释一下什么时候可以吗?
是否有关于何时可以使用它的一般解释,或者它是来自范围库的魔法?
boost - 范围-v3 / 排序混淆
看起来我有点简单,因为我不太能够在下面标记为错误的行上清楚地看到此错误的原因。
std::sort 和 boost::sort 选择默认谓词,但 range-v3 出于某种原因没有。这是范围-v3 0.36。clang 6/7 和 gcc 7/8 上的类似错误。
c++ - 在并行算法中使用 range::view::iota
由于在c++17中没有基于索引的并行算法,我想知道是否可以结合使用来模拟它。那是:ranges::view::iota
std::for_each
iota_view
似乎为适当的类型([range.iota.iterator])提供随机访问:
iota_view<I, Bound>::iterator::iterator_category
定义如下:(1.1) — 如果
I
模型Advanceable
,那么iterator_category
是random_access_iterator_tag
。(1.2) — 否则,如果
I
模型Decrementable
,iterator_category
则为bidirectional_iterator_tag
。(1.3) — 否则,如果
I
模型Incrementable
,iterator_category
则为forward_iterator_tag
。(1.4) — 否则,
iterator_category
是input_iterator_tag
。
上面的代码正确吗?iota_view
使用这种方式是否有任何性能损失?
编辑:我用range-v3、cmcstl2和 Intel 的PSTL做了一些测试。
使用 range-v3,上面的示例无法使用 GCC 8 编译。编译器抱怨begin
并end
具有不同的类型:
使用 cmcstl2 代码可以干净地编译,但不能并行运行。在我看来,它回退到顺序版本,可能是因为不满足前向迭代器的要求(https://godbolt.org/z/yvr-M2)。
有一个有点相关的 PSTL 问题(https://github.com/intel/parallelstl/issues/22)。
c++ - 使自定义范围 v3 视图可管道化
我正在尝试使用范围 v3 实现蒙面范围视图。不知何故,我最终陷入了我实施的情况
有效,但管道版本
没有,尽管operators
具有内部结构,但掩码正确到达。(我将我的实现masker
放入ranges::view
命名空间,虽然它不是范围 v3 的一部分)。
我的测试程序比较琐碎,创建一些小部件和一个无意义的掩码
忽略命名空间和调试打印输出masker
只是将数据范围和掩码压缩在一起,过滤掩码并将小部件作为视图返回:
上面的程序旨在两次打印出相同的结果范围,但我只得到:
因此,auto operator()(Rng&& rng, Msk&& msk) const
在循环使用正确的小部件时,带有的版本auto operator()(Msk&& msk) const
不会返回任何内容。
我尝试向前者添加一些调试打印输出(因为它最终被后者调用)并观察掩码正确到达。
(稍微削减输出)可以看到,在 I 中使用假定的返回范围operator()
遍历正确的小部件,但返回行中 lambdas 内的打印输出显示所有项目的“假”标志。
目前我最好的猜测是我搞砸了protect
, std::forward
, &&
, 或std::move
某处,尽管我试图尽可能接近filter.hpp
(因为我认为我已经相当了解它)并且还尝试了一些随机添加/删除&符号和无功而返。
任何建议如何解决这个问题?(理想情况下解释发生了什么?)。
提前致谢。
脚注:我目前不关心 c++11 的兼容性。
编辑:
我把乱七八糟的东西推到了github 上。
c++ - 尝试确定转换后的范围是否为空
尝试构建采用向量的代码,应用视图过滤器,然后进行变换,最后返回最后一个元素(如果存在):
编译它会导致以下错误:
因此,transform_view 似乎缺少基数概念,不管它是在转换后的向量上运行的事实。是否有可以应用于允许此代码工作的范围的运算符?需要 Cardinality似乎很奇怪,empty()
因为它只需要验证是否有任何元素,而不是提供元素的确切数量。
c++ - 从函数返回不同的范围结构
我试图获得表现得像真假面具的范围视图。为了进行逻辑运算,我想实现掩码的 ands 和 ors。我有一个工作编译时间或:
我可以称之为很好
目前这不能做的是构建一些在编译时未知的掩码。我目前的尝试是接受一个vector
范围,检查它的大小,然后调用可变参数模板或从之前:
这不会编译并出现以下错误:
据我了解,这告诉我我or_ranges
根据参数的数量返回不同的类型。(zip
我使用的保留了压缩在一起的知识)。
所以我想知道,如何键入擦除范围内的内容?