问题标签 [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 回答
374 浏览

c++ - C++20 中的 iterator_category 和 iterator_concept 有什么区别?

C++20带来了更强大的迭代器系统,其中之一就是iterator_conceptiterator_category.

我发现C++20 中许多迭代器的iterator_conceptand是不一致的。iterator_category以最著名iota_view为例

虽然是Rmodels random_access_rangeiterator_category它的迭代器的the只是一个input_iterator_tag,这和它是不一致的iterator_concept

为什么要引入 C++20 iterator_concept?它的目的是什么?如果我实现自己的迭代器,我该如何正确定义iterator_concept和定义iterator_categoryiterator_category在 C++20 中仍然有意义吗?

0 投票
2 回答
622 浏览

c++ - C++ 范围是否支持视图中的投影?

我知道范围内的算法(例如sort)支持投影,但在我看来,没有办法为视图获得该功能......我是对的吗?

例如,考虑以下工作代码

有没有办法删除 lambda 并执行以下操作:

注意:我的问题是成员变量投影,但显然在实际代码中还需要成员函数调用。

0 投票
0 回答
76 浏览

c++ - 使用 std::ranges 过滤向量

我想从收集的数据向量(每个都有一个时间戳)中只获取比指定时间更新的元素。savedPublishedData是我在其中查找 id 的地图。savedPublishedData.second是一个数据向量(自定义类),每个数据是一个时间戳。

我的编译器无法确定dataIsNewer() 的类型,所以我不知道如何正确返回找到的值。

0 投票
0 回答
60 浏览

c++ - 如何检查是否应该移动范围的元素?

有一个类似的问题:检查一个范围的元素是否可以移动?

我不认为其中的答案是一个很好的解决方案。实际上,它需要对所有容器进行部分专业化。


我做了尝试,但我不确定检查operator*()是否足够。

0 投票
2 回答
952 浏览

c++ - 为什么 std::ranges::filter_view 对象必须是非常量才能查询其元素?

见:https ://godbolt.org/z/vovvT19a5

为什么一个 std::ranges::filter_view 对象必须是非常量才能查询其元素?

0 投票
1 回答
222 浏览

c++ - C++20 范围是否具有过滤器或 any_of 的值(非谓词)版本?

经典 C++ 有时会为谓词算法选择 _if 后缀(而不是那些取值的),例如find_if//有时它没有find count_if(例如,虽然它需要谓词,但没有 _if 后缀,并且没有值版本的算法)。countany_ofany_of

据我所知,C++20filterranges::any_of没有值重载。

我浏览了 C++20 的整个 cppreference 页面,但一无所获,我认为这只是因为 C++20 范围库非常有限(只有少数视图)并且它与现有功能匹配(如果是any_of)。

我最好的尝试是包装逻辑并给它一个新名称。

0 投票
0 回答
2002 浏览

c++ - clang++-12 找不到库范围

我正在测试 C++ 20 的范围,这是我的main.cpp

编译它clang++-12但找不到“范围”:

打电话clang++12--std=c++20没有什么不同。

我该如何解决?

0 投票
1 回答
114 浏览

c++ - 如何重载运算符| 专门实现了 C++ 范围适配器?

由于范围被合并到 C++ 20 中,我一直在查看标题以查看operator|范围视图是如何重载的,但我找不到关于如何或在何处实现它的正确轨道。


C(R)根据我所阅读的内容,相当于R | C根据https://en.cppreference.com/w/cpp/ranges 。

或者,V(R, F)等价于R | V(F),其中V是范围适配器对象,R是可查看范围,并且F是包括自由函数在内的任何可调用对象。


我已经阅读了运算符重载的基本规则和习语是什么?并且已经知道如何正确地重载运算符,但是我找不到关于需要哪些函数参数或模板参数或语法含义的指南来满足上述实现的要求。

我的意思不是要替换范围适配器中的所有信息,而只是替换其在具有重载的适配器范围上的语法特征operator|

另一个是管道之后生成的对象类型必须与容器的类型相同,只要它满足以下概念即可。

我的想法:

一些应用程序(假设我们已经实现了这些功能):

其中myfilter

但我认为我的想法要么完全错误,要么在某些方面是错误的,其中大部分都被遗漏了。

0 投票
1 回答
70 浏览

c++ - 为什么范围算法在比较器参数之后有投影参数?

C++20 范围算法支持投影,显然与 STL 算法一样,它们支持自定义比较器。

但我发现令人费解的是投影和比较器的顺序。

我的“问题”(更烦人,我将很快学会使用这种参数顺序)是它破坏了从左到右的代码流。

考虑下面的代码(很抱歉它不短,但这就是重点,以表明在实际代码中,当变量名称不是 2 个字母长时,参数的顺序会使代码更难阅读):

//...

我对这段代码的问题是,如果投影在 lambda(比较器)之前,我认为它看起来会更好。

完整的代码神螺栓

我认为这个订单被选中的原因:

  • STL 算法通常将比较器作为第三个参数(迭代器之后的第一个参数),因此它是匹配的
  • 也许自定义比较器比投影更常见,因此避免需要提供该参数
0 投票
2 回答
152 浏览

c++ - 我可以让 `std::ranges::views::elements` 在我的类型范围内工作吗

考虑具有,和值的Point类型。如果我有一系列对象,例如,我需要添加什么才能使其与范围适配器一起使用?xyzPointstd::vector<Point>Pointstd::ranges::views::elements

目的是做类似的事情

文档提到适用于“类似std::ranges::views::elements元组”的值。我假设它应该类似于我们如何使我们的类型与结构化绑定一起工作,但我似乎遗漏了一些东西

我尝试过以下代码

这足以使结构化绑定起作用,但std::ranges::views::elements仍然不起作用。然后我认为这可能std::ranges::views::elements需要工作,我在命名空间std::get<n>(p)下面添加了一个专业化std

现在可以使用 std::get<0>(p) 来提取x值,但这对于std::ranges::views::elements. 使一系列Point对象工作还需要std::ranges::views::elements什么?


PS:我知道我可以在views::transform这里使用 a ,但我在这里的主要目的是通用并理解这些东西是如何组合在一起的。通用并理解这些东西是如何组合在一起的。