问题标签 [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.
c++ - 为什么 C++20 范围库有自己的命名空间?
为什么std::range::sort
(和其他基于范围的算法)在range
命名空间中实现?为什么不将其定义为std::sort
取值范围的超载?
c++ - 您如何创建自己的视图,并使用运算符 | 与现有视图交互?
为什么这段代码可以与#if 0
块一起工作,但如果你删除它会失败并显示一组相当复杂的错误消息?更重要的是,我如何使它与上面非常相似的块的结果相同?
如果我想要的不是完全可能的,有没有一种丑陋的方法来做到这一点?例如,我是否可以制作自己的组合机制并拥有一堆丑陋的垃圾来将其与现有视图接口。
c++ - std::ranges::make_heap 的约束是什么?
以下代码适用于 gcc:
但是当我切换到 C++20 的范围算法时:
似乎struct S
不符合要求ranges::make_heap
,但我不知道它到底是什么,有人可以帮忙吗?
c++ - 使用标准范围时对“结束”的引用不明确
当我尝试编译以下代码时:
我收到一条错误消息:
“开始”也是如此。我知道错误消息的含义,但我真的不明白为什么会这样。我什至不启动模板,那它为什么还要检查呼叫呢?我有点困惑,有人可以帮助我吗?
c++ - 后递增一个weakly_incrementable的用处?
我最近研究了这个weakly_incrementable
概念,我想知道后增量运算符有什么好处,因为这个概念没有定义对运算结果的任何要求。
真的可以退货void
吗operator++(int)
?
它似乎符合该概念的其他要求(例如它不必是可复制的)以及该incrementable
概念引入了i++
有用的要求这一事实,但在这种情况下,我想知道为什么i++
由概念定义全部。毕竟,当你需要一些东西来实现这个weakly_incrementable
概念时,你总是可以使用++i
而不是i++
因为
- 你不能依赖
i++
任何有用的属性,除了那些已经提供的++i
但是 i++
可能效率更低(例如,当它创建迭代器的副本时)。
c++ - 使用 C++20 可以更优雅地读取 N 个输入值吗?
假设我想从标准输入流中读取 n 个整数。阅读:
我发现推荐的解决方案基本上是:
我不喜欢这个,原因如下:
- 的用途
copy_atmost_n()
是假设未能“取消引用”first
迭代器将如何影响first
的后续值。但这种假定的行为比普遍明显的更为特殊。我相信这会让很多开发人员感到困惑。 - 需要一个“暂存”变量。
- 的重复
std::istream_iterator<int>
。
C++20,尤其是范围,是否为我们提供了更好的方法?
注意:返回一个std::vector<int>
. 如果它使事情变得更容易,也可以使用某种惰性结构。
c++ - 为什么我不能使用 istream_view 和 std::accumulate 来总结我的输入?
这个程序:
应该总结所有在标准输入流中显示为文本的整数。但是 - 它不能编译。我知道std::ranges::begin()
并且std::ranges::end()
存在,所以发生了什么事?编译器告诉我找不到合适的候选人;为什么?
c++ - 有没有可能使用转换的迭代器获取原始值的方法?
C++20 引入了views::elements
,views::keys
和views::values
来轻松处理类似元组的值的范围:
应用适配器后,v | std::views::elements<0>
成为每个元组的第一个元素的范围,因此返回类型ranges::find
是该转换范围的迭代器类型。
但是有没有一种可能的方法可以转换it
回原始迭代器类型以获取原始元组?
c++ - 为什么标准范围算法为右值参数返回 std::ranges::dangling 而不是......好吧,只是工作?
这是我(简化的)尝试实现一个ranges::min_element
适用于左值和右值参数的版本:
输出是
当然它缺少一些实现细节,但思路必须清楚:如果输入范围是右值,则返回值可以存储它的移动副本。因此,算法必须完全有可能std::ranges
使用右值参数。
我的问题是:为什么标准相反,只是通过引入那个奇怪的std::ranges::dangling
占位符来禁止在其算法中使用右值范围?
c++ - Range-v3 中是否有办法将元素添加到范围/视图中?
Range-v3 具有ranges::views::drop
和ranges::views::drop_last
从视图的前面或后面删除元素。
它是否提供类似的功能来将元素添加到视图中?
目前,我发现的最短方法是使用 a或 a到concat
范围/容器:iota
single