gpt4 book ai didi

C++20 和 : Which views/algorithms can be piped?

转载 作者:行者123 更新时间:2023-12-02 15:44:49 25 4
gpt4 key购买 nike

将 g++ 与 -std=C++20 或更高版本一起使用,以下编译(假设 vec 是适当类型的 vector ):

auto isEven = [](auto i) { return i % 2 == 0; }
auto filtered = vec | std::views::filter(isEven);
auto minEven = std::ranges::min_element(filtered);

但以下不是(std::ranges::__min_element_fn 的参数数量错误):

auto isEven = [](auto i) { return i % 2 == 0; }
auto minEven = vec | std::views::filter(isEven) | std::ranges::min_element();

这里的基本原理是什么?我怎么知道哪些漂亮的范围相关设施可以合并到管道中? (后者是我凭直觉写的;从概念上讲,它似乎是执行此操作的“新范围方式”。)

最佳答案

在 C++20 中,事情很简单。所有 View 都可以通过管道传输。没有算法可以通过管道传输。如果它在 views 命名空间中,那么它可以被管道传输,并且任何 View 都可以针对范围进行管道传输。也就是说,如果 | 的至少一个操作数来自 views 命名空间,而另一个操作数是一个范围,那么它可以被管道化。否则不能。

另一种内存方法是管道创建范围。 min_element 不创建范围;它只是找到一个范围的特定元素。它的结果不是一个范围,所以它不是可以通过管道传输的东西。

后来的版本已经决定根据当时最方便的方式来传输或不传输内容。没有押韵或理由,只是提出并接受了任何建议。 ranges::to 被管道化,因为它的作者提出了管道化并且委员会接受了它。没有 version of the proposal试图解释为什么可管道对象位于 ranges 命名空间中。这就是它的提议方式。

试图在什么可以通过管道传输和什么不能通过管道传输方面保持一致显然不是委员会的目标。也许通用范围算法将来可以使用管道。也许不是。

关于C++20 和 : Which views/algorithms can be piped?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74591247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com