具有要求的算法range

607 阅读2分钟

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功能:

  • 两个标准概念指定了传递range R 的要求:

    • 概念 std: :ranges: :random_access_range 要求 R 是一个提供随机访问迭代器的range(可用于读写、来回跳转和计算距离的迭代器)。该概念包括(包含)range的基本概念:std::range,它要求传递的参数要么是数组,要么提供begin()end()作为成员或独立函数。
    • 概念 std::sortable 要求range R 中的元素可以使用排序标准 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 天,点击查看活动详情