百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

C++20 Ranges:现代范围操作(现代c++白皮书)

yuyutoo 2025-07-03 20:43 5 浏览 0 评论

1. 引言:C++20 Ranges 库简介

C++20 引入的 Ranges 库是 C++ 标准库的重要更新,旨在提供更现代化、表达力更强的方式来处理数据序列(范围,range)。Ranges 库基于 Eric Niebler 的 Range-v3 库设计,融入标准库后,为开发者提供了一种简洁、直观的操作容器和迭代器的方式。它不仅提高了代码可读性,还通过组合式编程和惰性求值优化了性能。

Ranges 库将范围(range)视为一等公民,允许开发者以声明式方式操作数据序列。通过引入视图(views)和适配器(adaptors),它简化了传统迭代器模式的复杂性,并与现有 STL 算法无缝集成。本文将介绍 Ranges 库的特点、模块分类、应用场景,并通过代码示例展示其功能。

2. Ranges 库的特点

C++20 Ranges 库具有以下特点:

  1. 声明式编程:通过视图和管道操作符(|),开发者可以以直观的方式描述数据处理流程,类似函数式编程。
  2. 惰性求值:视图是惰性求值的,仅在需要时计算结果,优化性能。
  3. 与 STL 兼容:Ranges 库扩展了传统 STL 算法,支持直接操作范围,而无需显式指定迭代器。
  4. 类型安全:通过概念(Concepts)确保编译时类型检查,减少运行时错误。
  5. 可组合性:视图和适配器支持链式操作,代码更简洁。

3. Ranges 库模块分类

Ranges 库主要包含以下模块:

3.1 核心概念(Concepts)

Ranges 库引入了 C++20 概念(Concepts)来定义范围的属性,如 ranges::rangeranges::sized_rangeranges::view。这些概念确保代码在编译时验证范围的正确性。

3.2 范围类型

  • 容器范围:如 std::vectorstd::array 等标准容器。
  • 视图(Views):轻量级、非拥有型范围,如 ranges::views::filterranges::views::transform 等。
  • 迭代器范围:传统迭代器对仍可作为范围使用。

3.3 视图和适配器

视图是 Ranges 库的核心,提供惰性求值的序列操作。常见视图包括:

  • ranges::views::filter:过滤符合条件的元素。
  • ranges::views::transform:对每个元素应用变换函数。
  • ranges::views::take:获取前 N 个元素。
  • ranges::views::drop:跳过前 N 个元素。
  • ranges::views::reverse:反转范围。

3.4 算法

Ranges 库扩展了 STL 算法(如 std::ranges::sortstd::ranges::find),支持直接操作范围,而无需迭代器。

3.5 工具

包括 ranges::to 用于将视图转换为容器,ranges::beginranges::end 用于获取范围的迭代器。

4. 应用场景

Ranges 库适用于以下场景:

  1. 数据过滤和转换:如从数据集中提取特定元素或进行映射操作。
  2. 复杂数据处理管道:通过链式视图操作实现多步处理。
  3. 性能优化:惰性求值减少不必要的计算。
  4. 简化代码:替换冗长的迭代器代码,提高可读性。
  5. 现代 C++ 开发:与 C++20 特性(如概念、模块)结合,提升开发效率。

5. 代码示例

以下是 Ranges 库核心功能的代码示例,展示其强大功能。

5.1 过滤和转换

从向量中过滤偶数并将其平方。

 #include <iostream>
 #include <vector>
 #include <ranges>
 
 int main() {
     std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
     auto even_squares = numbers
         | std::ranges::views::filter([](int n) { return n % 2 == 0; })
         | std::ranges::views::transform([](int n) { return n * n; });
 
     for (int n : even_squares) {
         std::cout << n << " "; // 输出:4 16 36
     }
     std::cout << std::endl;
     return 0;
 }

5.2 取前 N 个元素并反转

获取向量前 3 个元素并反转。

 #include <iostream>
 #include <vector>
 #include <ranges>
 
 int main() {
     std::vector<int> numbers = {1, 2, 3, 4, 5};
     auto result = numbers
         | std::ranges::views::take(3)
         | std::ranges::views::reverse;
 
     for (int n : result) {
         std::cout << n << " "; // 输出:3 2 1
     }
     std::cout << std::endl;
     return 0;
 }

5.3 范围算法

对向量进行排序并查找特定元素。

 #include <iostream>
 #include <vector>
 #include <ranges>
 #include <algorithm>
 
 int main() {
     std::vector<int> numbers = {5, 2, 8, 1, 9};
     std::ranges::sort(numbers);
     
     auto found = std::ranges::find(numbers, 8);
     if (found != numbers.end()) {
         std::cout << "找到: " << *found << std::endl; // 输出:找到: 8
     }
 
     for (int n : numbers) {
         std::cout << n << " "; // 输出:1 2 5 8 9
     }
     std::cout << std::endl;
     return 0;
 }

5.4 视图转容器

将过滤后的视图转换为新向量。

 #include <iostream>
 #include <vector>
 #include <ranges>
 
 int main() {
     std::vector<int> numbers = {1, 2, 3, 4, 5};
     auto filtered = numbers | std::ranges::views::filter([](int n) { return n > 3; });
     std::vector<int> result = filtered | std::ranges::to<std::vector>();
 
     for (int n : result) {
         std::cout << n << " "; // 输出:4 5
     }
     std::cout << std::endl;
     return 0;
 }

5.5 复杂管道操作

组合多个视图进行复杂处理。

 #include <iostream>
 #include <vector>
 #include <ranges>
 #include <string>
 
 int main() {
     std::vector<std::string> words = {"hello", "world", "cpp", "ranges"};
     auto result = words
         | std::ranges::views::filter([](const std::string& s) { return s.length() > 3; })
         | std::ranges::views::transform([](const std::string& s) { 
             return s + "!"; 
         })
         | std::ranges::views::take(2);
 
     for (const auto& s : result) {
         std::cout << s << " "; // 输出:hello! world!
     }
     std::cout << std::endl;
     return 0;
 }

6. 总结

C++20 Ranges 库通过声明式编程、惰性求值和强大的视图机制,极大地简化了序列操作。无论是数据过滤、转换,还是复杂管道操作,Ranges 都能提供简洁高效的解决方案。开发者可以利用其与 STL 的兼容性和类型安全特性,编写更现代、可维护的 C++ 代码。

相关推荐

墨尔本一华裔男子与亚裔男子分别失踪数日 警方寻人

中新网5月15日电据澳洲新快网报道,据澳大利亚维州警察局网站消息,22岁的华裔男子邓跃(Yue‘Peter’Deng,音译)失踪已6天,维州警方于当地时间13日发布寻人通告,寻求公众协助寻找邓跃。华...

网络交友须谨慎!美国犹他州一男子因涉嫌杀害女网友被捕

伊森·洪克斯克(图源网络,侵删)据美国广播公司(ABC)25日报道,美国犹他州一名男子于24日因涉嫌谋杀被捕。警方表示,这名男子主动告知警局,称其杀害了一名在网络交友软件上认识的25岁女子。雷顿警...

一课译词:来龙去脉(来龙去脉 的意思解释)

Mountainranges[Photo/SIPA]“来龙去脉”,汉语成语,本指山脉的走势和去向,现比喻一件事的前因后果(causeandeffectofanevent),可以翻译为“i...

高考重要考点:range(range高考用法)

range可以用作动词,也可以用作名词,含义特别多,在阅读理解中出现的频率很高,还经常作为完形填空的选项,而且在作文中使用是非常好的高级词汇。...

C++20 Ranges:现代范围操作(现代c++白皮书)

1.引言:C++20Ranges库简介C++20引入的Ranges库是C++标准库的重要更新,旨在提供更现代化、表达力更强的方式来处理数据序列(范围,range)。Ranges库基于...

学习VBA,报表做到飞 第二章 数组 2.4 Filter函数

第二章数组2.4Filter函数Filter函数功能与autofilter函数类似,它对一个一维数组进行筛选,返回一个从0开始的数组。...

VBA学习笔记:数组:数组相关函数—Split,Join

Split拆分字符串函数,语法Split(expression,字符,Limit,compare),第1参数为必写,后面3个参数都是可选项。Expression为需要拆分的数据,“字符”就是以哪个字...

VBA如何自定义序列,学会这些方法,让你工作更轻松

No.1在Excel中,自定义序列是一种快速填表机制,如何有效地利用这个方法,可以大大增加工作效率。通常在操作工作表的时候,可能会输入一些很有序的序列,如果一一录入就显得十分笨拙。Excel给出了一种...

Excel VBA入门教程1.3 数组基础(vba数组详解)

1.3数组使用数组和对象时,也要声明,这里说下数组的声明:'确定范围的数组,可以存储b-a+1个数,a、b为整数Dim数组名称(aTob)As数据类型Dimarr...

远程网络调试工具百宝箱-MobaXterm

MobaXterm是一个功能强大的远程网络工具百宝箱,它将所有重要的远程网络工具(SSH、Telnet、X11、RDP、VNC、FTP、MOSH、Serial等)和Unix命令(bash、ls、cat...

AREX:携程新一代自动化回归测试工具的设计与实现

一、背景随着携程机票BU业务规模的不断提高,业务系统日趋复杂,各种问题和挑战也随之而来。对于研发测试团队,面临着各种效能困境,包括业务复杂度高、数据构造工作量大、回归测试全量回归、沟通成本高、测试用例...

Windows、Android、IOS、Web自动化工具选择策略

Windows平台中应用UI自动化测试解决方案AutoIT是开源工具,该工具识别windows的标准控件效果不错,但是当它遇到应用中非标准控件定义的UI元素时往往就无能为力了,这个时候选择silkte...

python自动化工具:pywinauto(python快速上手 自动化)

简介Pywinauto是完全由Python构建的一个模块,可以用于自动化Windows上的GUI应用程序。同时,它支持鼠标、键盘操作,在元素控件树较复杂的界面,可以辅助我们完成自动化操作。我在...

时下最火的 Airtest 如何测试手机 APP?

引言Airtest是网易出品的一款基于图像识别的自动化测试工具,主要应用在手机APP和游戏的测试。一旦使用了这个工具进行APP的自动化,你就会发现自动化测试原来是如此简单!!连接手机要进行...

【推荐】7个最强Appium替代工具,移动App自动化测试必备!

在移动应用开发日益火爆的今天,自动化测试成为了确保应用质量和用户体验的关键环节。Appium作为一款广泛应用的移动应用自动化测试工具,为测试人员所熟知。然而,在不同的测试场景和需求下,还有许多其他优...

取消回复欢迎 发表评论: