在 C++ 中使用范围是否可取?

Bub*_*aya 6 c++ range-v3 c++20 std-ranges

我发现大多数 C++ stl 算法的传统语法很烦人;使用它们编写起来很长只是一个小问题,但它们总是需要对现有对象进行操作,这在很大程度上限制了它们的可组合性。

我很高兴看到 stl 中范围的出现;然而,从 C++20 开始,存在严重的缺点:标准库的不同实现对此的支持各不相同,并且 range-v3 中存在的许多内容并未进入 C++20,例如(对我来说)非常令人惊讶),将视图转换为向量(对我来说,如果我无法将计算结果存储在向量中,这会使这一切变得毫无用处)。

另一方面,使用 range-v3 对我来说似乎也不理想:它的文档很少(而且我不同意其中的所有内容都是不言自明的),而且更严重的是,C++20 的想法range 与 range-v3 所做的不同,所以我不能只是说,好吧,让我们坚持使用 range-v3;无论如何,这将在某个时候成为标准。

那么,我应该使用两者中的任何一个吗?或者这一切都不值得,并且通过依赖 std 范围或 range-v3,使我的代码太难以维护和移植?

康桓瑋*_*康桓瑋 7

在 C++ 中使用范围是否可取?

是的。

range-v3 中存在的许多内容并未进入 C++20,例如(令我惊讶的是)将视图转换为向量

是的。但std::ranges::to已被C++23采用,功能更强大,与C++23的stl容器的范围版本构造函数配合良好。

那么,我应该使用两者中的任何一个吗?

您应该使用标准库<ranges>

它包含多项 PR 增强功能,例如owning_view重新设计split_view和正在进行的 LWG 修复。此外,C++23不仅带来了更多的适配器如join_with_viewzip_view等,还带来了更强大的功能,如对用户定义范围适配器的管道支持(P2387)、格式化范围(P2286)等。你所要做的就是等待编译器执行它。您可以参考cppreference以获取最新的编译器支持。

  • 请问基于什么理由建议?_是_,可悲的是,它没有提供任何信息,不是吗? (4认同)