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

c++ - 使用标准范围将字符串范围与分隔符连接起来

我想使用范围将跨度中包含的四个字节转换为字符串。这是输入和输出的示例:

这是我想出的,遵循range-v3 how to action::join with delimiter的答案:

但是,它无法编译,并且非常...让我们说详细的错误:

有没有一种简单的方法可以使用带有 C++20 范围的分隔符来连接这些字符串?是因为字符串是临时的吗?

0 投票
3 回答
826 浏览

c++ - C++ std::stringstarts_with/ends_with 不区分大小写的版本?

C++20 将starts_with、 ends_with 添加到 std::string。

有没有一种很好的方法让它区分大小写?

请注意,性能很重要,所以我不想将两个字符串(或std::min(len1, len2)其中的一部分)都小写/大写。

与常规<algorithm>算法不同starts_with,比较器没有过载,所以我看不到这样做的好方法。

而且我有点理解 90+% 的情况是区分大小写的,除非非常有用,否则 C++ 中的成员 fns 会被避免......所以我知道为什么存在这个限制,我只是好奇是否可以将相对可读的东西一起破解C++20 没有我用自定义比较器手动调用 std::equal(或范围版本)。

0 投票
1 回答
407 浏览

c++ - 与视图一起使用的自定义容器类型的要求

我开始玩std::ranges并想了解视图是如何工作的。所以我尝试编写自己的容器和迭代器类型,并希望在视图中使用它。

但是似乎缺少一些东西,但编译器只告诉我begin()视图中没有方法,但没有告诉我为什么。

例子:

编译

main.cpp:90:16: 错误:'struct std::ranges::views::__adaptor::_RangeAdaptorClosurestd::ranges::views::__adaptor::_RangeAdaptor<_Callable::operator()<{MyFixedContainer&, main( )::<lambda(int)>&}>::<lambda(_Range&&)> >' 没有名为 'begin' 的成员 90 | 自动 b = y.begin();

https://godbolt.org/z/doW76j

0 投票
2 回答
290 浏览

c++ - C++20 范围是否支持按功能分组?

有时,根据对象的成员函数之一(getter 或某些计算)的值对对象进行分组/分区非常有用。

C++20 范围是否启用类似

注1:有这个老问题,接受的答案是只使用原始for循环

注意 2:range-v3 有这个令人困惑的 group_by 算法,这对我的任务似乎没用:

给定一个源范围和一个二元谓词,返回一个范围范围,其中每个范围都包含源范围中的连续元素,使得以下条件成立:对于除第一个元素之外的范围内的每个元素,当该元素和第一个元素是传递给二元谓词,结果为真。本质上,views::group_by 将连续元素与二元谓词组合在一起。

0 投票
1 回答
1764 浏览

c++ - C++20 范围和排序

我正在处理 C++ 20 中的最后 4 个,试图学习新的主要特性。尝试了一些与范围相关的网络代码,我写了:

然后我会排序,就像 range-v3 一样|action::sort,但我知道这个实现是不一样的。

我发现排序的方式是:

我错了吗?有人知道如何用管道样式对视图进行排序吗?

0 投票
1 回答
211 浏览

c++ - 如何将 istream_view 收集到容器中?

我试图为我的的扩展实现一个通用的归约操作,ranges该操作会将 any 的元素收集range到给定的容器中。为了实现这一点,我首先创建了一个用于提取template template参数的虚拟类型,并提供了operator|用于将 arange与它结合起来:

测试如下:

代码完成执行没有问题。

但是,当与以下代码一起使用时,代码无法编译std::ranges::istream_view

无法通过一堵错误墙进行编译,在我看来,其中最重要的一个是:

这对我来说很有意义。容器要求用于通过构造函数构造它们的迭代器具有相同的类型

但这很好 - 这std::ranges::views::common_view就是创建的目的。所以我尝试修改operator|为:

再次,它未能以较小的错误墙编译,其中我认为这是最相关的:

我不太明白这个错误表示什么,但我想这意味着它istream_view不能被复制构造。对我来说有点道理。


但我真的希望我能拥有这个通用的to“函子”。当我们推断我们正在处理输入范围1istream_view时,我认为可以使用基于范围的for循环并将元素添加到所选容器中。

所以我尝试了这个:

然后告诉我,除其他外:

这不是唯一的问题。通常将元素添加到任何容器中也存在问题。range据我所知,采用 a 的构造函数是向容器添加元素的唯一通用方法和方法。

我觉得必须有一种正确且更简单的方法来做我想做的事情。to如果也适用于非模板,则奖励积分,即,我不仅可以这样做to<std::vector>,而且to<std::string>. 在第一种情况下,它将推断元素并创建所需的实例化std::vector,但在第二种情况下,它将获取所有元素并std::string用这些元素初始化 an。我怎样才能使这项工作?


1这假设实际问题在于我们正在使用输入范围这一事实。我不确定是不是这样。如果有人能指出我推理中可能存在的错误,我会很高兴。

0 投票
3 回答
1030 浏览

c++ - 擦除删除习语如何与范围/约束算法一起使用?

我正在尝试对擦除删除习语使用 c++20 约束算法:

但是当我做一个简单的转换时:

我收到一个参数不匹配的错误:erase

如果第二个参数是 ,则会产生类似的错误std::ranges::end(v)

我怎样才能让它工作?


该问题最初用于remove代替unique,但std::erase所有容器都存在重载,这使得该特定用例的动机降低。

0 投票
1 回答
120 浏览

c++ - 如何使用 range::sort 进行由布尔值控制的升序或降序排序

使用范围可以让我减少样板文件,所以这很好,但我找不到按升序或降序排序的方法。以下代码段编译得很好(g++ 10.2.0),投影确实简化了代码,不需要 lambda。

现在我需要一个布尔控制升序或降序排序。

我想写一个像这样的简单语句:

但是std::ranges::lessstd::ranges::greater没有相同的类型,所以三元运算符不起作用。

我可以有一个带有捕获的 lambda,如下所示,但这会添加更多代码行。有什么简单的解决方案吗?

0 投票
1 回答
158 浏览

c++ - 为什么 std::ranges::views::filter 不能将 std::isupper 作为参数?

考虑以下代码:

新的范围适配器filter_upper适用于全局旧 c-function ::isupper,但如果我替换为std::isupper,我得到这个编译器错误:

问题出在哪里?

0 投票
2 回答
315 浏览

c++ - 使用 std::ranges::min 在 std::map 上投影

是否可以在 std::map 上投影?我尝试将 std::ranges::min 与投影一起使用,但它似乎抛出了我无法解释为什么它不喜欢事物的错误。

我可以解决它,但如果这一个班轮工作会很好。

最好的