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

c++ - 为什么 C++20 不提供范围/约束版本的算法?

根据cppreference, header 下的所有数字算法都<numeric>没有ranges在 C++20 中获得版本。有原因吗?

0 投票
1 回答
108 浏览

c++ - 当匹配计数大于某个阈值时,我可以使用 C++20 范围来中断吗?

考虑以下前置范围代码:

它看起来比原始循环更好,但如果 val 在 v 中很常见,它可能会非常低效。

有什么方法可以使用 C++20 范围,以便在我遇到 val 6 次后停止迭代。换句话说,我正在寻找一种在满足我的条件时引入休息的方法。我有这个可憎的东西,这似乎有效,但它比原始 for 循环丑得多。

完整代码链接:https ://godbolt.org/z/86djdK

0 投票
1 回答
665 浏览

c++ - 使用基于概念的递归函数模板在扣除“auto”之前使用“auto [...]”

我想创建一个deep_flatten函数模板,它会产生一个深度编辑range的元素。join例如,如果我们只考虑嵌套std::vector的 s,我可以有:

这使我能够做到:

正如预期的那样,它将以下文本打印到控制台中:

但是,我不太喜欢这个解决方案。它不仅效率低下(创建许多临时向量),而且它也仅适用于std::vectors. 我想我可以使用更多的魔法和使用std::ranges::range概念:

这在我看来很简单——我们有一个std::ranges::range并且我们检查它的值类型。根据它是否是嵌套范围,我们递归或简单地返回joined 元素。

可悲的是,它不起作用。尝试运行后:

我收到一条错误消息:

研究了类似的问题后,我无法真正理解为什么会出现错误。

我在用gcc version 10.1.0 (Rev3, Built by MSYS2 project)

0 投票
1 回答
176 浏览

c++ - 在 lambda 函数中保存其返回值时,std::ranges::sort 不能用作“constexpr”函数

此函数f可以将 C++20 范围算法对象作为参数,然后使用它:

它适用于std::ranges::sort

algo但是当我在 lambda 中保存返回值时:

GCC 拒绝并说:

constexpr为什么当我尝试保存algo' 的返回值 时,此函数变为非 ' '?或者它只是一个错误

更新:以下代码将被GCC 接受,因此这很可能是一个错误,我已经提交了错误报告

0 投票
1 回答
706 浏览

c++ - C++20 std::ranges::sort 是否不需要支持 std::vector?

我注意到std::ranges::sort无法排序std::vector<bool>

这是允许的吗?我们是否需要专门化std::ranges::sortfor std::vector<bool>?有没有关于委员会如何考虑的信息?

0 投票
2 回答
350 浏览

c++ - 为什么要引入 std::ranges::less ?

cppreference on 上std::ranges::less,在注释中我们可以看到:

与 不同std::lessstd::ranges::less要求所有六个比较运算符<<=>>===!=有效(通过totally_ordered_with约束)。

但为什么?为什么我们要使用std::ranges::less{}而不是std::less{}less{}仅当定义了其他比较运算符(而不仅仅是一个)时,我们才想要的实际情况是什么<

0 投票
0 回答
182 浏览

c++ - 如果分隔符是输入范围的最后一个元素,为什么 views::split 会忽略分隔符后的空子范围?

对于以下代码

输出为 2。最后一个分隔符之后的空子范围不存在于输出范围中。

这似乎不一致,因为如果输入范围中出现分隔符,我预计N+1输出范围中会有子范围。N为什么不是这样?

请注意 range-v3 的作用完全相同所以我确信这是故意的,但我想知道为什么。

0 投票
1 回答
184 浏览

c++ - 为什么 const char[] 更适合 std::ranges::range 而不是显式的 const char* 自由重载,以及如何解决它?

我想<<为任何人写一个通用的range,我最终得到了这个:

像这样测试:

它完美地工作并输出:

但是,当测试时:

它出乎意料地输出:

用调试器运行这段代码,我得出一个结论,空范围的问题是我们运行return out << "[]";. 一些 C++ 魔法决定了我刚刚写的,

更好的匹配,然后提供<ostream>

因此,它不像我们通常看到的那样仅发送"[]"到输出流,而是递归回自身,但"[]"作为range参数。

那是更好的匹配的原因是什么?[]单独发送相比,我可以以更优雅的方式解决此问题吗?


编辑:这似乎很可能是 GCC 10.1.0 中的一个错误,因为较新的版本拒绝该代码。

0 投票
1 回答
294 浏览

c++ - 创建自己的(管道)范围 ::views 和 ::actions 的规则是什么?

这个答案中,我们可以看到我们可以创建自己的views。我试过了:

当我认为我成功了:

原来我真的失败了,因为std::ranges::range<decltype(rng)>false

试图找出原因,我试图采取std::ranges::begin(rng),这导致了几十行错误,或多或少归结为:

这很奇怪,因为我确实提供了成员begin()end()(除非__member_begin<_Tp>没有做它看起来正在做的事情)。

完整的错误信息如下:

我到底错过了什么?如何正确创建自己的<ranges>扩展?

0 投票
1 回答
481 浏览

c++ - 为什么 std::ranges 算法缺少并行重载(采用执行策略参数)?

C++ 算法库中的许多函数都具有采用类型参数的重载ExecutionPolicy,例如std::copy. 但是,我注意到std::ranges命名空间中的相应函数没有这些并行重载。这是不幸的,因为这意味着在许多情况下,非范围变体将更有用。

这是什么原因?是否有向std::ranges命名空间添加并行重载的建议?