范围算法和标准算法之间的区别

Har*_*rry 9 c++ c++20

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

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

Nic*_*las 11

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

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

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