问题标签 [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 不提供范围/约束版本的算法?
根据cppreference, header 下的所有数字算法都<numeric>
没有ranges
在 C++20 中获得版本。有原因吗?
c++ - 当匹配计数大于某个阈值时,我可以使用 C++20 范围来中断吗?
考虑以下前置范围代码:
它看起来比原始循环更好,但如果 val 在 v 中很常见,它可能会非常低效。
有什么方法可以使用 C++20 范围,以便在我遇到 val 6 次后停止迭代。换句话说,我正在寻找一种在满足我的条件时引入休息的方法。我有这个可憎的东西,这似乎有效,但它比原始 for 循环丑得多。
c++ - 使用基于概念的递归函数模板在扣除“auto”之前使用“auto [...]”
我想创建一个deep_flatten
函数模板,它会产生一个深度编辑range
的元素。join
例如,如果我们只考虑嵌套std::vector
的 s,我可以有:
这使我能够做到:
正如预期的那样,它将以下文本打印到控制台中:
但是,我不太喜欢这个解决方案。它不仅效率低下(创建许多临时向量),而且它也仅适用于std::vector
s. 我想我可以使用更多的c++20魔法和使用std::ranges::range
概念:
这在我看来很简单——我们有一个std::ranges::range
并且我们检查它的值类型。根据它是否是嵌套范围,我们递归或简单地返回join
ed 元素。
可悲的是,它不起作用。尝试运行后:
我收到一条错误消息:
研究了类似的问题后,我无法真正理解为什么会出现错误。
我在用gcc version 10.1.0 (Rev3, Built by MSYS2 project)
c++ - C++20 std::ranges::sort 是否不需要支持 std::vector?
我注意到std::ranges::sort
无法排序std::vector<bool>
:
这是允许的吗?我们是否需要专门化std::ranges::sort
for std::vector<bool>
?有没有关于委员会如何考虑的信息?
c++ - 为什么要引入 std::ranges::less ?
在cppreference on 上std::ranges::less
,在注释中我们可以看到:
与 不同
std::less
,std::ranges::less
要求所有六个比较运算符<
、<=
、>
、>=
和==
都!=
有效(通过totally_ordered_with
约束)。
但为什么?为什么我们要使用std::ranges::less{}
而不是std::less{}
?less{}
仅当定义了其他比较运算符(而不仅仅是一个)时,我们才想要的实际情况是什么<
?
c++ - 为什么 const char[] 更适合 std::ranges::range 而不是显式的 const char* 自由重载,以及如何解决它?
我想<<
为任何人写一个通用的range
,我最终得到了这个:
像这样测试:
它完美地工作并输出:
但是,当测试时:
它出乎意料地输出:
用调试器运行这段代码,我得出一个结论,空范围的问题是我们运行return out << "[]";
. 一些 C++ 魔法决定了我刚刚写的,
是更好的匹配,然后提供<ostream>
,
因此,它不像我们通常看到的那样仅发送"[]"
到输出流,而是递归回自身,但"[]"
作为range
参数。
那是更好的匹配的原因是什么?[
与]
单独发送相比,我可以以更优雅的方式解决此问题吗?
编辑:这似乎很可能是 GCC 10.1.0 中的一个错误,因为较新的版本拒绝该代码。
c++ - 创建自己的(管道)范围 ::views 和 ::actions 的规则是什么?
在这个答案中,我们可以看到我们可以创建自己的views
。我试过了:
当我认为我成功了:
原来我真的失败了,因为std::ranges::range<decltype(rng)>
是false
。
试图找出原因,我试图采取std::ranges::begin(rng)
,这导致了几十行错误,或多或少归结为:
这很奇怪,因为我确实提供了成员begin()
和end()
(除非__member_begin<_Tp>
没有做它看起来正在做的事情)。
完整的错误信息如下:
我到底错过了什么?如何正确创建自己的<ranges>
扩展?