问题标签 [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 投票
2 回答
2451 浏览

c++ - 你能用新的范围库压缩吗?

见:http ://eel.is/c++draft/#ranges

给定两个长度相等的 C++2a 范围(如在符合范围库的范围概念的对象中)a 和 b,有没有办法将它们压缩在一起,这样:

你期望什么?也就是说,它返回一个具有可解构绑定对的范围:

0 投票
2 回答
771 浏览

c++ - 是否存在一个 range::views::group_by 对应项,它考虑了所有元素,而不仅仅是连续的元素?

C++20'sstd::ranges中,我们可以预期得到1。这可能非常方便,但我在玩它时发现了一个问题。从 Eric Niebler 的手册中,我们可以读到“本质上,将连续元素与二元谓词组合在一起。。让我们看一个例子。我有一些s ,我想将分成两个范围 - 代表偶数和奇数。我最初的方法是简单地做:views::group_byviews::group_bystd::vectorint

但这行不通。或者,换一种说法,它会起作用,但是对于任何熟悉其他语言(甚至 API)中类似操作的人来说,它会产生意想不到的(我想对某些人来说)结果。这个程序的输出是:

偶数和奇数并非全部分组 - 这是因为它们并非都是连续的。3并且9配对在一起,因为它们都是oodcontiguous。类似地(除了是even1210。但是7, 5and1将创建一个单独的组 - 它们不会与3and分组9,这不是我想要或期望的。

我们当然可以做的是对partition向量ints进行排序,以便偶数和赔率形成两组。问题是......范围内没有。这给我留下了两种选择,它们都没有特别吸引我:views::partition

1.查看矢量前:stdranges::partition

来电:

就在我们基于范围for的循环之前,我们有我们想要的输出:

我不喜欢它,因为它缺乏可组合性——这是ranges关键因素之一。老实说,我也不想分割向量。我想在两组中打印它的元素 - 偶数和赔率。

2. 使用actions::sort奇偶比较器对向量进行排序:

请注意,|=运算符周围的括号是必需的,因为否则|将首先评估范围的组合运算符 ( ),我们最终将使用上面的代码打印向量的排序元素,完全忽略分组 ( ??? )。

这种方法还可以,但仍然不是很好。我更喜欢有一个group_by可以,例如,取一个值并返回一个键(Java's 和C#' 处理分组的方法),或者无论如何考虑整个范围,或者至少有actions::partition可用的。

旁注:我看到了views::grouping_by仅使用连续元素的基本原理。这是最有效的方式——无需存储任何东西,无需返回或进一步查看。没关系,有时它是工作最佳工具。但我认为,对于过去使用过类似 API 的人来说,这违反直觉,会造成混乱。

最后重复这个问题 - 根据我提出的示例和所需的方法,有没有更简洁的方法来做我想做的事?


1我在cppreference上找不到它,但我想我在某处看到了它所在的确认信息。如果我弄错了,请纠正我。

0 投票
1 回答
225 浏览

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?

0 投票
1 回答
445 浏览

c++ - 为什么范围不能用于管道库功能?

Jonathan Boccara(Fluent C++的作者)编写了一个名为管道的库。

这个“管道”,存储库的主页说,不像使用范围,即使它看起来一样:它不是基于延迟拉动,而是急切推动。但是据说不能使用范围库来执行各种“管道”操作。例如:

  • unzip - 采用压缩输入 - 本质上是一系列 k 元组 - 并产生 k 个单独的、独立的输出。
  • fork - 生成容器/范围的多个(独立)副本。

我不太明白为什么原则上会出现这种情况。(当然,您无法获得结束迭代器/哨兵的范围除外。)

0 投票
2 回答
159 浏览

c++ - 是排序 std::vector 的代码吗C++20 中的长度是否正确?

我编写了一个按长度对向量字符串进行排序的代码。不幸的是,我不确定它是否会以这种形式在下一个标准中起作用。这是 C++20 中的正确代码吗?

0 投票
1 回答
226 浏览

c++ - C++20 范围适配器的递归应用导致编译时无限循环

C++20 中的范围库支持表达式

使用范围适配器删除n范围的第一个元素。rdrop

但是,如果我递归地从一个范围中删除元素,编译器会进入一个无限循环。


最小的工作示例:(在 GCC 10 中编译需要无限时间)

预期输出:

为什么这需要无限的时间来编译,我应该如何解决这个问题?

0 投票
0 回答
47 浏览

c++ - 更新到 VS2019 16.6 后无法将范围变换分配给向量

我使用的是 VS2019 的早期版本(我相信是 16.2),昨天升级到 16.6,突然工作代码抛出编译器错误,我不知道如何清除它们。

我有以下代码:

这在 16.2 中工作得很好,但现在抛出以下错误:

我无法弄清楚如何从 range::view::transform 分配到任何类型的 vector<> 。

不确定类型检查/强制转换是否变得更严格,或者实现中的某些内容是否发生了std::ranges变化。你们的任何帮助将不胜感激。

0 投票
1 回答
761 浏览

c++ - 使用范围拆分 string_view

我有一个字符串,其中包含以,字符分隔的数字序列。要将序列中的值读入数组,我创建了 GCC 10 拒绝编译的以下代码:

简而言之,编译器抱怨没有可用于变量类型data()的方法。我是否误解了那种应该符合标准的类型?从我的观点来看,这似乎是有争议的。size()octetoctetcontiguous_rangestring_view

0 投票
1 回答
906 浏览

c++ - std::ranges::begin 和 std::begin 有什么区别?

std::begin和 new 和有什么不一样std::ranges::begin?(同样适用于end,size等)

两者似乎工作方式相同:

按预期编译和打印1111

过时ranges::begin了吗?std::begin还是两者有不同的用例?

0 投票
1 回答
678 浏览

c++ - 在 C++20 中将多个范围适配器连接成一个范围

考虑以下情况:

有没有一种优雅的方法可以将这三个适配器连接到一个视图中,如下所示:

这似乎是不可能的,因为rng1,rng2rng3's 是非常不同的类型。

有人可以提供替代解决方案吗?谢谢。