0

0

C++中如何利用std::identity在算法中保留元素的原始值? (C++20投影功能)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-25 11:25:02

|

739人浏览过

|

来源于php中文网

原创

std::identity 是 c++20 引入的零开销函数对象,调用 std::identity{}(x) 直接返回 x,用于显式启用 ranges 算法的投影重载,确保类型匹配与接口统一。

c++中如何利用std::identity在算法中保留元素的原始值? (c++20投影功能)

std::identity 是什么,为什么它能当投影用?

它就是个空操作的函数对象,调用 std::identity{}(x) 直接返回 x 本身。C++20 引入投影(projection)参数后,很多算法(比如 std::ranges::sortstd::ranges::max_element)允许你传一个可调用对象,把每个元素“映射”成用于比较或处理的值。这时候 std::identity{} 就是那个“不映射”的安全选择——不是写 [] (auto& x) { return x; },而是标准库提供的、零开销、类型明确、语义清晰的方案。

哪些算法支持 std::identity 投影?

主要是 std::ranges 下带投影参数的算法,常见有:

  • std::ranges::sortstd::ranges::stable_sort
  • std::ranges::min_elementstd::ranges::max_element
  • std::ranges::find_if(注意:这里投影用于谓词前的转换,不是所有场景都适用)
  • std::ranges::unique(配合二元谓词时,投影决定“相等性依据”)

老式 std::sort(非 ranges 版)不接受投影,强行传会编译失败。别混用。

std::identity 和直接不传投影的区别?

区别很大,不是“可有可无”:

立即学习C++免费学习笔记(深入)”;

  • 不传投影 → 调用的是无投影重载,比如 std::ranges::sort(r, comp),此时 comp 直接作用于元素本身
  • 显式传 std::identity{} → 调用的是带投影重载,比如 std::ranges::sort(r, comp, std::identity{}),此时 comp 作用于 std::identity{}(a)std::identity{}(b),也就是还是 ab,但签名和语义已切换

关键影响在于:有些算法只提供带投影的重载(比如某些自定义容器适配器),或者你需要统一接口风格(比如模板函数里统一用投影参数)。这时不用 std::identity{},编译就过不去。

Pliny
Pliny

创建、分享和重新组合AI应用程序

下载

示例:

std::vector<std::string> v = {"hello", "world", "cpp"};
std::ranges::sort(v, {}, std::identity{}); // ✅ 显式投影,合法

而下面这行会编译失败(因为 {} 是默认比较器,但没给投影,匹配不到带 projection 的重载):

std::ranges::sort(v, {}); // ❌ 编译错误:no matching function

容易踩的坑:类型推导与 const 限定

std::identity 本身不改变 const 性质,但它对引用类型的处理很敏感:

  • 如果容器元素是 const intstd::identity{}(x) 返回 const int&,后续比较可能因 cv 限定不匹配失败
  • 投影函数返回类型必须能被比较器接受;若你用了自定义 comp,它参数类型得跟投影结果一致,而不是原始元素类型
  • 别写成 std::identity()(带括号调用),那是个临时对象调用,语法错;必须是 std::identity{}std::identity() 作为类型(如 decltype(std::identity{})

最稳妥写法永远是 std::identity{} —— 它是字面量,零成本,且在所有支持 C++20 ranges 的标准库实现中行为一致。

复杂点在于:投影不是“透明转发”,它是算法逻辑的一部分。哪怕你用 std::identity{},也意味着你主动选择了投影路径,编译器会按该路径做类型推导和重载决议。漏掉它,或类型不匹配,往往报错信息又长又绕,直奔模板展开底层,实际问题却只是少了个大括号。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

404

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

552

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

584

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1651

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

505

2025.10.17

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

21

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号