【问题标题】:Difference between Ranges algorithms and std algorithmsRanges算法和std算法的区别
【发布时间】:2020-12-31 04:49:27
【问题描述】:

许多标准库算法在 C++20 中有两个版本:一个在 std 命名空间中,另一个在 std::ranges 命名空间中同名。比如std::ranges::countstd::count都用于统计满足某个谓词的元素个数。

为什么这些算法有两个版本?

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    范围功能将 C++20 概念添加到迭代器和范围,并将其算法的定义等限制在这些概念中。但是,C++20 概念与 C++17 命名要求有不同的要求。通常,满足 C++17 要求的类型将满足 C++20 概念等价物but not in all cases1。虽然更新您自己的代码以使其适用于 C++20 概念通常很容易,但它仍然会破坏用户编写的迭代器的向后兼容性,以停止在 C++20 中编译。

    因此,他们没有将受限算法强加给用户,而是创建了您可以选择使用的新算法。因此,没有代码损坏。

    1:另外,因为 C++17 的需求从未被任何东西真正检查过,所以很容易意外地编写一个没有完全实现它们的迭代器要求。您使用的算法实际上不能使用您未实现的功能,因此看起来您实现了您需要的功能。如果您没有针对多个标准库实现测试代码,则尤其如此。如果 C++20 开始检查您的迭代器,它会突然破坏您在技术上已损坏但功能正常的代码。

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 2020-09-22
      • 2021-10-01
      • 2012-12-18
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多