range-v3相关内容

为什么使用CRTP的std::Range::view_interface

根据cp首选项,使用奇怪的循环模板模式(CRTP)技术定义视图的助手类模板view_interface。 它们背后的设计理念是什么?与重写派生类中的虚拟基类方法相比,是否有显著优势? 推荐答案 如果您为基类提供虚函数,则它将具有这些函数。一直都是。它永远不能不具有这些函数,并且从它派生的每个类都将继承这些函数。 view_interface具有empty函数当且仅当该类型的范围 ..
发布时间:2022-05-17 10:25:23 C/C++开发

我们能用C++20构建带有视图的容器吗?

Range即将使用C++20标准版本。 我的问题是:我们是否能够构建具有任何范围的(现有)标准库容器?更重要的是,使用范围视图? 例如,这是否会: #include #include #include int main() { auto sq = [](int x) { return x * x; }; st ..
发布时间:2022-05-16 22:25:18 C/C++开发

生成器在C++20视图管道中调用了两次

在views适配器的简单管道中,有gen函数被调用以生成值序列(使用内部状态),然后对其进行筛选。 令人惊讶和违反直觉(至少对我来说)的是,生成器函数在每次迭代中被调用两次,因此对同一筛选器的下一次检查失败(筛选的值不会在管道中重复使用)。 您知道这是否是正确的预期行为(以及为什么)? 在GCC 10.3、11.1和干线(code)中使用libstdc++测试,和range-v3 ..
发布时间:2022-05-16 15:57:50 C/C++开发

为什么 range::ostream_iterator 默认可构造?

这个问题是在这里的评论中讨论的. 在 Eric Niebler 的 ranges-v3 库中(有点像是成为C++20 的标准),ranges::ostream_iterator 是 default-constructible - 没有 ostream. 怎么会? 我认为后来有效构造的“虚拟"构造是 C++ 中的一种反模式,我们正在逐渐摆脱它.std::ostream iterat ..
发布时间:2022-01-10 14:46:09 C/C++开发

为什么`accumulate`不能进入C ++ 20的范围?

我怀疑 accumulate 并不是唯一没有实现的算法. 也许现在有一种更好的方法可以在一定范围内进行累积(折叠),因此 accumulate 已经过时了? 解决方案 不, accumulate 是一个非常合理的算法,并且没有其他算法使它过时.不包含在c ++ 20中的原因只是时间问题.最好尽可能增加范围,而不必担心立即添加所有内容.否则,存在没有受限算法可能会使其陷入c ++ 20 ..
发布时间:2021-04-20 19:05:58 C/C++开发

根据转换后的值查找最小元素

这是代码审查给我带来的任务。我想根据一种特殊的比较谓词从集合中选择一个最小值。像这样: 结构体{...}; float calcReduction(复杂元素); 复杂的findMinValueWithPredicates(const std :: vector&& values) { auto it = std :: min_element(values.begin(),v ..
发布时间:2020-09-28 02:14:42 C/C++开发

如何将范围存储为类中的字段?

我想将范围存储为类中的字段,以便以后可以重用几次.但是,与局部变量不同,我不能简单地将其类型指定为auto.另一方面,库创建的范围类型非常复杂.我要花大量的时间才能手动找出正确的类型,而且如果我选择更改范围的获取方式,将来将很难维护. 所以,我想,也许我可以使用decltype来帮助自己: class MyClass { public: using MyRange = ..
发布时间:2020-07-05 05:17:35 C/C++开发

如何使用range-v3压缩向量的向量

(这是 sum-vector with range-v3 的后续版本) 如果我有两个(或更多)向量,可以将zip与range-v3一起使用,如下所示: std::vector v1{1,1,1}; std::vector v2{2,2,2}; auto v = ranges::views::zip( v1, v2 ) | ranges::views:: ..
发布时间:2020-07-05 05:15:24 C/C++开发

使用range-v3读取逗号分隔的数字列表

我想使用Ranges(我使用range-v3实现)来读取输入流,该输入流是用逗号分隔的数字列表.在没有范围的情况下这样做是微不足道的,但是... 我认为这是解决问题的直接方法: auto input = std::istringstream("42,314,11,0,14,-5,37"); auto ints = ranges::istream_view(input) | rang ..
发布时间:2020-07-05 05:14:22 C/C++开发