问题标签 [std-ranges]

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 回答
328 浏览

c++ - 为什么 C++20 范围库有自己的命名空间?

为什么std::range::sort(和其他基于范围的算法)在range命名空间中实现?为什么不将其定义为std::sort取值范围的超载?

0 投票
1 回答
295 浏览

c++ - 您如何创建自己的视图,并使用运算符 | 与现有视图交互?

为什么这段代码可以与#if 0块一起工作,但如果你删除它会失败并显示一组相当复杂的错误消息?更重要的是,我如何使它与上面非常相似的块的结果相同?

强制性编译器资源管理器链接

如果我想要的不是完全可能的,有没有一种丑陋的方法来做到这一点?例如,我是否可以制作自己的组合机制并拥有一堆丑陋的垃圾来将其与现有视图接口。

0 投票
1 回答
121 浏览

c++ - std::ranges::make_heap 的约束是什么?

以下代码适用于 gcc:

但是当我切换到 C++20 的范围算法时:

我得到了这个编译器错误:

似乎struct S不符合要求ranges::make_heap,但我不知道它到底是什么,有人可以帮忙吗?

0 投票
1 回答
218 浏览

c++ - 使用标准范围时对“结束”的引用不明确

当我尝试编译以下代码时:

我收到一条错误消息:

“开始”也是如此。我知道错误消息的含义,但我真的不明白为什么会这样。我什至不启动模板,那它为什么还要检查呼叫呢?我有点困惑,有人可以帮助我吗?

0 投票
1 回答
118 浏览

c++ - 后递增一个weakly_incrementable的用处?

我最近研究了这个weakly_incrementable概念,我想知道后增量运算符有什么好处,因为这个概念没有定义对运算结果的任何要求。

真的可以退货voidoperator++(int)

它似乎符合该概念的其他要求(例如它不必是可复制的)以及该incrementable概念引入了i++有用的要求这一事实,但在这种情况下,我想知道为什么i++由概念定义全部。毕竟,当你需要一些东西来实现这个weakly_incrementable概念时,你总是可以使用++i而不是i++因为

  1. 你不能依赖i++任何有用的属性,除了那些已经提供的++i但是
  2. i++可能效率更低(例如,当它创建迭代器的副本时)。
0 投票
1 回答
93 浏览

c++ - 使用 C++20 可以更优雅地读取 N 个输入值吗?

假设我想从标准输入流中读取 n 个整数。阅读:

如何将 N 个整数读入向量?

我发现推荐的解决方案基本上是:

我不喜欢这个,原因如下:

  1. 的用途copy_atmost_n()是假设未能“取消引用”first迭代器将如何影响first的后续值。但这种假定的行为比普遍明显的更为特殊。我相信这会让很多开发人员感到困惑。
  2. 需要一个“暂存”变量。
  3. 的重复std::istream_iterator<int>

C++20,尤其是范围,是否为我们提供了更好的方法?

注意:返回一个std::vector<int>. 如果它使事情变得更容易,也可以使用某种惰性结构。

0 投票
2 回答
269 浏览

c++ - 为什么我不能使用 istream_view 和 std::accumulate 来总结我的输入?

这个程序:

应该总结所有在标准输入流中显示为文本的整数。但是 - 它不能编译。我知道std::ranges::begin()并且std::ranges::end()存在,所以发生了什么事?编译器告诉我找不到合适的候选人;为什么?

0 投票
2 回答
87 浏览

c++ - 有没有可能使用转换的迭代器获取原始值的方法?

C++20 引入了views::elements,views::keysviews::values来轻松处理类似元组的值的范围:

应用适配器后,v | std::views::elements<0>成为每个元组的第一个元素的范围,因此返回类型ranges::find是该转换范围的迭代器类型。

但是有没有一种可能的方法可以转换it回原始迭代器类型以获取原始元组?

0 投票
1 回答
268 浏览

c++ - 为什么标准范围算法为右值参数返回 std::ranges::dangling 而不是......好吧,只是工作?

这是我(简化的)尝试实现一个ranges::min_element适用于左值和右值参数的版本:

输出是

当然它缺少一些实现细节,但思路必须清楚:如果输入范围是右值,则返回值可以存储它的移动副本。因此,算法必须完全有可能std::ranges使用右值参数。

我的问题是:为什么标准相反,只是通过引入那个奇怪的std::ranges::dangling占位符来禁止在其算法中使用右值范围?

0 投票
0 回答
126 浏览

c++ - Range-v3 中是否有办法将元素添加到范围/视图中?

Range-v3 具有ranges::views::dropranges::views::drop_last从视图的前面或后面删除元素。

它是否提供类似的功能来将元素添加到视图中?

目前,我发现的最短方法是使用 a或 a到concat范围/容器:iotasingle