问题标签 [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.

0 投票
1 回答
439 浏览

c++ - 为什么 range-v3 将其函数对象放入内联命名空间?

在 range-v3 中,所有函数都是内联命名空间中的真正全局函数对象:

命名空间的目的是什么function_objects?据我所知,图书馆的其他任何地方都没有引用它。

0 投票
1 回答
215 浏览

c++ - 如何从 range-v3 的 istream_range 检索文件大小?

我正在尝试从 range-v3 获取文件大小值,就像这样。

但是,距离函数似乎返回了错误的大小。为什么?

godbolt.org/g/DsouJE

0 投票
1 回答
165 浏览

c++ - 如何使用 range-v3 获得集合的所有权?

我想从代表 STL 集合视图的函数中返回一个范围,如下所示:

但是,view::transform不拥有所有权is,所以当我运行它时,会有未定义的行为,因为在退出is时被释放。createRange

如果我尝试std::move(is)作为输入,我会得到一个静态断言,表明我不能使用右值引用作为 a 的输入view。有什么方法可以确保视图拥有集合的所有权?

编辑:一些附加信息

我想添加一些澄清信息。我有一个数据流,data我有一个将数据转换为结构的视图Foo,看起来像这样:

我想要做的是std::pair<std::string, int>通过在整个值中分配名称来创建一个范围。我天真的尝试看起来像这样:

但是,这会导致未定义的行为,因为values已释放。我能够解决这个问题的唯一方法是制作valuesastd::shared_ptr并在传递给的 lambda 中捕获它view::transform以保持它的生命周期。这似乎是一个不雅的解决方案。

我认为我正在寻找的是一个拥有源集合所有权的视图,但它看起来不像 range-v3 那样。

或者,我可以使用老式的 for 循环创建分布式版本,但这似乎不适用于view::join

即使这确实适用于view::join,我也认为范围和循环的混合隐喻也是不雅的。

0 投票
1 回答
1672 浏览

c++ - 使用 rangev3 在 C++ 中模拟 python 样式的列表理解?

使用 rangev3 库我可以做到这一点:

给我 1995 年 3 月的日期:

有没有办法以更接近 python 的语法来做到这一点:

特别是我觉得从日期/函数开始有助于代码的可读性。

0 投票
0 回答
60 浏览

c++ - 解释元组上的循环

在 range-v3 中,以下是 c++17 的合法代码。

我从来没有在auto [value, suit]任何地方看到过这种语法,有人可以解释一下什么时候可以吗?
是否有关于何时可以使用它的一般解释,或者它是来自范围库的魔法?

0 投票
1 回答
911 浏览

boost - 范围-v3 / 排序混淆

看起来我有点简单,因为我不太能够在下面标记为错误的行上清楚地看到此错误的原因。

std::sort 和 boost::sort 选择默认谓词,但 range-v3 出于某种原因没有。这是范围-v3 0.36。clang 6/7 和 gcc 7/8 上的类似错误。

0 投票
3 回答
4842 浏览

c++ - 在并行算法中使用 range::view::iota

由于在中没有基于索引的并行算法,我想知道是否可以结合使用来模拟它。那是:ranges::view::iotastd::for_each

iota_view似乎为适当的类型([range.iota.iterator])提供随机访问:

iota_view<I, Bound>::iterator::iterator_category定义如下:

(1.1) — 如果I模型Advanceable,那么iterator_categoryrandom_access_iterator_tag

(1.2) — 否则,如果I模型Decrementableiterator_category则为bidirectional_iterator_tag

(1.3) — 否则,如果I模型Incrementableiterator_category则为forward_iterator_tag

(1.4) — 否则,iterator_categoryinput_iterator_tag

上面的代码正确吗?iota_view使用这种方式是否有任何性能损失?


编辑:我用range-v3cmcstl2和 Intel 的PSTL做了一些测试。

使用 range-v3,上面的示例无法使用 GCC 8 编译。编译器抱怨beginend具有不同的类型:

使用 cmcstl2 代码可以干净地编译,但不能并行运行。在我看来,它回退到顺序版本,可能是因为不满足前向迭代器的要求(https://godbolt.org/z/yvr-M2)。

有一个有点相关的 PSTL 问题(https://github.com/intel/parallelstl/issues/22)。

0 投票
2 回答
523 浏览

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 上

0 投票
1 回答
242 浏览

c++ - 尝试确定转换后的范围是否为空

尝试构建采用向量的代码,应用视图过滤器,然后进行变换,最后返回最后一个元素(如果存在):

编译它会导致以下错误:

因此,transform_view 似乎缺少基数概念,不管它是在转换后的向量上运行的事实。是否有可以应用于允许此代码工作的范围的运算符?需要 Cardinality似乎很奇怪,empty()因为它只需要验证是否有任何元素,而不是提供元素的确切数量。

0 投票
1 回答
72 浏览

c++ - 从函数返回不同的范围结构

我试图获得表现得像真假面具的范围视图。为了进行逻辑运算,我想实现掩码的 ands 和 ors。我有一个工作编译时间或:

我可以称之为很好

目前这不能做的是构建一些在编译时未知的掩码。我目前的尝试是接受一个vector范围,检查它的大小,然后调用可变参数模板或从之前:

这不会编译并出现以下错误:

据我了解,这告诉我我or_ranges根据参数的数量返回不同的类型。(zip我使用的保留了压缩在一起的知识)。

所以我想知道,如何键入擦除范围内的内容?