问题标签 [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++ - 你能用新的范围库压缩吗?
见:http ://eel.is/c++draft/#ranges
给定两个长度相等的 C++2a 范围(如在符合范围库的范围概念的对象中)a 和 b,有没有办法将它们压缩在一起,这样:
你期望什么?也就是说,它返回一个具有可解构绑定对的范围:
c++ - 是否存在一个 range::views::group_by 对应项,它考虑了所有元素,而不仅仅是连续的元素?
在C++20
'sstd::ranges
中,我们可以预期得到1。这可能非常方便,但我在玩它时发现了一个问题。从 Eric Niebler 的手册中,我们可以读到“本质上,将连续元素与二元谓词组合在一起。”。让我们看一个例子。我有一些s ,我想将它分成两个范围 - 代表偶数和奇数。我最初的方法是简单地做:views::group_by
views::group_by
std::vector
int
但这行不通。或者,换一种说法,它会起作用,但是对于任何熟悉其他语言(甚至 API)中类似操作的人来说,它会产生意想不到的(我想对某些人来说)结果。这个程序的输出是:
偶数和奇数并非全部分组 - 这是因为它们并非都是连续的。3
并且9
配对在一起,因为它们都是ood和contiguous。类似地(除了是even)12
和10
。但是7
, 5
and1
将创建一个单独的组 - 它们不会与3
and分组9
,这不是我想要或期望的。
我们当然可以做的是对partition
向量ints
进行排序,以便偶数和赔率形成两组。问题是......范围内没有。这给我留下了两种选择,它们都没有特别吸引我:views::
partition
1.查看矢量前:std
ranges::partition
std
来电:
就在我们基于范围for
的循环之前,我们有我们想要的输出:
我不喜欢它,因为它缺乏可组合性——这是ranges
关键因素之一。老实说,我也不想分割向量。我想在两组中打印它的元素 - 偶数和赔率。
2. 使用actions::sort
奇偶比较器对向量进行排序:
请注意,|=
运算符周围的括号是必需的,因为否则|
将首先评估范围的组合运算符 ( ),我们最终将使用上面的代码打印向量的排序元素,完全忽略分组 ( ??? )。
这种方法还可以,但仍然不是很好。我更喜欢有一个group_by
可以,例如,取一个值并返回一个键(Java
's 和C#
' 处理分组的方法),或者无论如何考虑整个范围,或者至少有actions::partition
可用的。
旁注:我看到了views::grouping_by
仅使用连续元素的基本原理。这是最有效的方式——无需存储任何东西,无需返回或进一步查看。没关系,有时它是工作的最佳工具。但我认为,对于过去使用过类似 API 的人来说,这违反直觉,会造成混乱。
最后重复这个问题 - 根据我提出的示例和所需的方法,有没有更简洁的方法来做我想做的事?
1我在cppreference上找不到它,但我想我在某处看到了它所在的确认信息。如果我弄错了,请纠正我。
c++ - Why doesn't libstdc++ have span::span(Container&)?
According to cppreference, in C++20, std::span
is supposed to be constructible using container references:
but in the master branch of libstdc++'s span file (as of Jan 18th 2020), I don't see these constructors. I do see a constructor taking a Range&&
- is that a sufficient replacement? Or - am I missing something?
c++ - 为什么范围不能用于管道库功能?
Jonathan Boccara(Fluent C++的作者)编写了一个名为管道的库。
这个“管道”,存储库的主页说,不像使用范围,即使它看起来一样:它不是基于延迟拉动,而是急切推动。但是据说不能使用范围库来执行各种“管道”操作。例如:
- unzip - 采用压缩输入 - 本质上是一系列 k 元组 - 并产生 k 个单独的、独立的输出。
- fork - 生成容器/范围的多个(独立)副本。
我不太明白为什么原则上会出现这种情况。(当然,您无法获得结束迭代器/哨兵的范围除外。)
c++ - 是排序 std::vector 的代码吗C++20 中的长度是否正确?
我编写了一个按长度对向量字符串进行排序的代码。不幸的是,我不确定它是否会以这种形式在下一个标准中起作用。这是 C++20 中的正确代码吗?
c++ - C++20 范围适配器的递归应用导致编译时无限循环
C++20 中的范围库支持表达式
使用范围适配器删除n
范围的第一个元素。r
drop
但是,如果我递归地从一个范围中删除元素,编译器会进入一个无限循环。
最小的工作示例:(在 GCC 10 中编译需要无限时间)
预期输出:
为什么这需要无限的时间来编译,我应该如何解决这个问题?
c++ - 更新到 VS2019 16.6 后无法将范围变换分配给向量
我使用的是 VS2019 的早期版本(我相信是 16.2),昨天升级到 16.6,突然工作代码抛出编译器错误,我不知道如何清除它们。
我有以下代码:
这在 16.2 中工作得很好,但现在抛出以下错误:
我无法弄清楚如何从 range::view::transform 分配到任何类型的 vector<> 。
不确定类型检查/强制转换是否变得更严格,或者实现中的某些内容是否发生了std::ranges
变化。你们的任何帮助将不胜感激。
c++ - 使用范围拆分 string_view
我有一个字符串,其中包含以,
字符分隔的数字序列。要将序列中的值读入数组,我创建了 GCC 10 拒绝编译的以下代码:
简而言之,编译器抱怨没有可用于变量类型data()
的方法。我是否误解了那种应该符合标准的类型?从我的观点来看,这似乎是有争议的。size()
octet
octet
contiguous_range
string_view
c++ - std::ranges::begin 和 std::begin 有什么区别?
std::begin
和 new 和有什么不一样std::ranges::begin
?(同样适用于end
,size
等)
两者似乎工作方式相同:
按预期编译和打印1111
。
过时ranges::begin
了吗?std::begin
还是两者有不同的用例?
c++ - 在 C++20 中将多个范围适配器连接成一个范围
考虑以下情况:
有没有一种优雅的方法可以将这三个适配器连接到一个视图中,如下所示:
这似乎是不可能的,因为rng1
,rng2
和rng3
's 是非常不同的类型。
有人可以提供替代解决方案吗?谢谢。