Ranges算法与STD算法的差异

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

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


解决方案

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

因此,他们没有将受约束的算法强加给用户,而是创建了新的算法,您可以选择使用这些算法。因此,不会出现代码中断。

1:此外,由于C++17的需求实际上从未经过任何检查,因此很容易意外地编写一个没有完全实现其需求的迭代器。您使用的算法可能不会实际使用您没有实现的功能,从而给人一种您实现了所需功能的外观。如果您没有针对多个标准库实现测试代码,情况尤其如此。如果C++20开始检查您的迭代器,它会突然中断您在技术上损坏但功能正常的代码。

相关文章