range的新标准算法将range参数声明为模板参数。这是必需的,因为range没有特定类型(或派生自公共基类)。为了在处理range时指定和验证必要的要求,C++20 引入了range的几个概念。例如,考虑range的 sort() 算法。原则上,它的定义如下:
template<std: :ranges: :random_access_range R,
typename Comp=std::ranges::1ess>
requires std::sortable<std::ranges::iterator_t<R>,Comp>
... sort(R&& r,Comp comp={});
此声明已具有多个新的range功能:
-
两个标准概念指定了传递
rangeR 的要求:- 概念
std: :ranges: :random_access_range要求 R 是一个提供随机访问迭代器的range(可用于读写、来回跳转和计算距离的迭代器)。该概念包括(包含)range的基本概念:std::range,它要求传递的参数要么是数组,要么提供begin()和end()作为成员或独立函数。 - 概念 std::sortable 要求
rangeR 中的元素可以使用排序标准 Comp 进行排序。
- 概念
-
新类型实用程序
std::ranges::iterator_t用于将迭代器类型传递给可排序。 -
作为默认比较标准,使用
Comp std::ranges::less,它定义了排序算法使用运算符<进行排序。std: :ranges: : less是一种受概念约束的std::less,它确保支持所有比较运算符 (==,!=,<,<=,> 和 >=),并且值具有顺序。
这意味着,您可以使用随机访问迭代器和可排序元素传递任何range:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
void print(const auto& coll){
for (const auto& elem : coll){
std::cout <<elem <<' ';
}
std::cout <<'\n';
}
int main(int argc, char** argv)
{
std::vector<std::string> col1{"Rio", "Tokyo", "New York", "Berlin"};
std::ranges::sort(coll);
std::ranges::sort(col1[0]);
print(coll);
int arr[]={42,0,8,15,7};
std::ranges::sort(arr);
print(arr);
}
该程序有以下输出
Beilnr New York Rio Tokyo
0 7 8 15 42
如果传递没有随机访问迭代器的容器/range,则会收到一条错误消息,指出不满足概念 std::ranges::random_access_range
std::list<std::string> col12{"New York", "Rio", "Tokyo"};
std::ranges::sort(co112);
如果传递的容器/range无法将元素与运算符 < 进行比较,则不满足 std::sortable:
std::vector<std::complex<double>> co113;
std::ranges::sort(co113);
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情”