std::ranges::views::common, std::ranges::common_view

std::ranges::views::common, std::ranges::common_view

C++20 引入的用于将范围适配为“通用范围”的工具,主要解决某些算法需要传统迭代器对(如 begin 和 end 类型相同)的问题。

基本概念

1. 功能
  • 适配传统算法:将范围(range)的迭代器和哨兵(sentinel)类型统一,使其适配需要“迭代器对”的旧式算法(如 C++17 之前的算法)。
  • 类型一致性:确保 begin() 和 end() 返回的迭代器类型相同。
  • 零开销原则:仅在必要时添加类型转换,无额外内存分配。

以下是详细说明和示例:


核心概念

  • 问题背景:C++20 的某些范围(如 split_view)的 begin 和 end 返回的迭代器类型可能不同,但传统算法(如 C++17 前的算法)需要它们类型相同。
  • 解决方案common_view 将范围适配为 begin 和 end 迭代器类型相同的“通用范围”。

std::ranges::common_view

  • 定义template<std::ranges::view V> class common_view : public std::ranges::view_interface<common_view<V>>
  • 适用场景
    • 当原始范围的迭代器和哨兵类型不同,但需要转换为相同类型时。
    • 需要将范围传递给传统算法(如接受 int* 和 int* 的算法)。

语法与参数

1. 语法
auto common_view = range | std::ranges::views::common;
  • range:输入范围(如容器、视图)。

示例 1:适配 split_view
#include <ranges>
#include <vector>
#include <algorithm>
#include <iostream>int main() {std::string str = "hello,world,cpp20";auto split = str | std::views::split(',');// split 的迭代器和哨兵类型不同,无法直接传递给传统算法// 使用 common_view 适配auto common_range = split | std::views::common;// 现在可以像传统范围一样使用for (const auto& part : common_range) {for (char c : part) std::cout << c;std::cout << '\n';}
}

示例 2:传递给传统算法

某些传统算法(如 std::sort)要求 begin() 和 end() 的迭代器类型严格一致,但 C++20 的某些范围(如 std::ranges::iota_view)可能返回不同类型的哨兵:

示例 2:处理子范围
#include <ranges>
#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};auto reversed = vec | std::views::reverse;// 传统算法需要 begin 和 end 类型相同// 使用 common_view 适配auto common_reversed = reversed | std::views::common;// 使用 std::sort(仅示例,反转后排序可能无意义)std::ranges::sort(common_reversed); // 需要迭代器类型相同for (int x : common_reversed) {std::cout << x << ' '; // 输出:1 2 3 4 5(排序后的反转)}
}

std::ranges::views::common

  • 定义:范围适配器对象,可通过管道操作符 | 简化 common_view 的创建。
  • 等效操作views::common(r) 等价于 common_view<views::all_t<decltype(r)>>{r}
示例 3:结合管道操作符
#include <ranges>
#include <iostream>
#include <list>
#include <algorithm> // 必须包含此头文件以使用 std::findint main() {std::list<int> lst = {1, 2, 3, 4, 5};auto even = lst | std::views::filter([](int x) { return x % 2 == 0; });// 使用 views::common 适配auto common_even = even | std::views::common;// 传递给传统算法 std::findif (std::find(common_even.begin(), common_even.end(), 4) != common_even.end()) {std::cout << "Found 4\n";}
}

注意事项

  1. 性能common_view 可能引入额外开销(如缓存迭代器),需谨慎使用。
  2. 适用性:仅在需要传统迭代器对时使用,现代算法(如 std::ranges::sort)通常不需要。
  3. 生命周期:确保底层范围的生命周期长于 common_view

总结

  • common_view:将 begin 和 end 迭代器类型不同的范围适配为类型相同的通用范围。
  • views::common:通过管道操作符简化 common_view 的创建。
  • 典型场景:与传统算法交互,或需要迭代器类型一致的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.3 数组和集合的初始及赋值

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商…

分布式光伏发电的发展现状与前景

分布式光伏发电的发展现状与前景 1、分布式光伏发电的背景2、分布式光伏发电的分类2.1、集中式光伏发电2.1.1、特点、原则2.1.2、优点2.1.3、缺点 2.2、分布式光伏发电2.2.1、特点、原则2.2.2、优点2.2.3、缺点 2.3、对比 3、分布式光伏发电的现状4、分布式光伏发电的应用场景4…

13 | 实现统一的错误返回

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…

Java静态变量与PHP静态变量的对比

Java的静态变量在多线程并发的情况下是线程共有的。以下是关键点总结&#xff1a; 存储位置&#xff1a;静态变量属于类&#xff0c;存储在方法区&#xff08;或元空间&#xff09;&#xff0c;这是所有线程共享的内存区域。因此&#xff0c;所有线程访问的都是同一个静态变量实…

c++20 Concepts的简写形式与requires 从句形式

c20 Concepts的简写形式与requires 从句形式 原始写法&#xff08;简写形式&#xff09;等效写法&#xff08;requires 从句形式&#xff09;关键区别说明&#xff1a;组合多个约束的示例&#xff1a;两种形式的编译结果&#xff1a;更复杂的约束示例&#xff1a;标准库风格的约…

上下分层、左右分离的驱动设计思想

之前了解了最简单的驱动程序、但是不易扩展、现在继续学习、上下分层、左右分离的驱动设计思想。 1、led_dev.c函数 上层函数&#xff0c;①定义一个结构体&#xff0c;存储函数用来接应app的函数。②定义一个入口函数&#xff0c;将我们接应的函数告诉内核&#xff0c;给这个…

人工智能在医疗领域的应用:技术革新与未来展望

人工智能&#xff08;AI&#xff09;技术正在重塑医疗行业的面貌。从辅助诊断到药物研发&#xff0c;从健康管理到手术机器人&#xff0c;AI的广泛应用不仅提升了医疗效率&#xff0c;还为精准医疗和个性化治疗提供了新可能。根据2025年多份研究报告及政策文件&#xff0c;全球…

《历史代码分析》5、动态控制列表的列

​​ 本系列《历史代码分析》为工作中遇到具有代表性的代码。今天我们讲一下&#xff0c;动态展示列表的列&#xff0c;因为找不到代码了&#xff0c;所有本篇用图展示。 举个栗子 ​​ 我们希望能够动态的控制列表的列&#xff0c;例如&#xff0c;英语老师只想知道自己学…

Windows HD Video Converter Factory PRO-v27.9.0-

Windows HD Video Converter Factory PRO 链接&#xff1a;https://pan.xunlei.com/s/VOL9TaiuS7rXbu-1kEDndoceA1?pwd7qch# 支持300多种视频格式转换&#xff0c;在保留视频质量的同时&#xff0c;压缩率可达80%&#xff0c;转换速度可达50X速率&#xff01; 支持画面剪切、片…

C++程序设计语言笔记——抽象机制:构造、清理、拷贝和移动

0 应该将构造函数、赋值操作以及析构函数设计为一组匹配的操作。 在C中&#xff0c;构造函数、赋值操作符和析构函数共同管理对象的资源生命周期。为确保资源安全且一致地处理&#xff0c;需将它们作为一组匹配的操作设计。以下是关键要点&#xff1a; 为何需要协同设计&…

##Hive安装-初始化元数据报错 *** schemaTool failed ***

报错&#xff1a; org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version. Underlying cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure 解决方案&#xff1a; 尝试一&#xff1a;javax.jdo.o…

远程手机遥控开关原理及应用

远程手机遥控开关的工作原理主要是通过互联网传递无线信号&#xff0c;控制用电器的一种智能家居产品。 远程手机遥控开关的基本套件包括&#xff1a;手机APP、网线、家用WIFI中转无服务器或者是工厂提供的自带网线端口的中转服务器、连接用电器的接收器。使用时&#xff0c;手…

Mac java全栈开发环境配置

前言 由于最近手中的windows本子坏了,所以搞了一台m系列的macbookpro 作为一个开发者 面对新设备最先考虑的应该就是各种sdk、中间件服务、环境变量配置和工具了吧!!! 本文将带你手把手学习Mac搭建属于自己的本地开发环境 安装brew 什么是brew? ‌Brew(全称Homebrew)…

Ubuntu conda虚拟环境不同设备之间迁移

Ubuntu conda环境迁移&#xff08;conda-pack&#xff09; 方法一&#xff1a;压缩拷贝方法二&#xff1a;conda-pack 在一台电脑配置好conda虚拟环境后&#xff0c;若在其它电脑需要同样的环境&#xff0c;可通过如下两种方式进行迁移。 方法一&#xff1a;压缩拷贝 找到Ubu…

详细学习 pandas 和 xlrd:从零开始

详细学习 pandas 和 xlrd&#xff1a;从零开始 前言 在数据处理和分析中&#xff0c;Excel 文件是最常见的数据格式之一。Python 提供了强大的库 pandas&#xff0c;可以轻松地处理 Excel 文件中的数据。同时&#xff0c;我们还可以使用 xlrd 来读取 Excel 文件&#xff0c;尤…

HTMLCSS绘制三角形

1.代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>01triangle</title><s…

vue3-element-admin 前后端本地启动联调

一、后端环境准备 1.1、下载地址 gitee 下载地址 1.2、环境要求 JDK 17 1.3、项目启动 克隆项目 git clone https://gitee.com/youlaiorg/youlai-boot.git数据库初始化 执行 youlai_boot.sql 脚本完成数据库创建、表结构和基础数据的初始化。 修改配置 application-dev.y…

C++中error C2027: 使用了未定义类型 问题部分解决方法

在 C 编程中&#xff0c;遇到错误 C2027&#xff1a;“使用了未定义类型”通常意味着在代码中使用了某种类型&#xff0c;但是编译器无法识别这个类型的定义。这个错误通常有几个常见的原因&#xff1a; 1. 缺少包含头文件 如果使用了某个库中的类型&#xff0c;但是没有包含…

WinForm模态与非模态窗体

1、模态窗体 1&#xff09;定义&#xff1a; 模态窗体是指当窗体显示时&#xff0c;用户必须先关闭该窗体&#xff0c;才能继续与应用程序的其他部分进行交互。 2&#xff09;特点&#xff1a; 窗体以模态方式显示时&#xff0c;会阻塞主窗体的操作。用户必须处理完模态窗体上…