当前位置: 首页 > news >正文

C++去重函数unique超详解|有序数组去重必学

C++去重函数unique超详解|有序数组去重必学

    • 一、函数原型
    • 二、函数说明
    • 三、函数用法
    • 3.1 普通有序数组去重
    • 3.2 vector去重

unique函数可以删除有序数组中的重复元素, 是 C++ 标准库<algorithm>中的函数。

注意:使用它的前提是有序数组,就是排好序的数组。

unique的意思是“独一无二的”。uni其实就是one的变形,que就是汉语拼音“缺”,所以它的意思就是哥们就哥儿一个,缺少兄弟姐妹。

一、函数原型

这玩艺叫函数模板,比较复杂,以老金的智慧,也解释不清楚,大概看一眼就行了。

// 默认使用 operator== 比较template<classForwardIt>ForwardItunique(ForwardIt first,ForwardIt last);// 使用自定义二元谓词 predtemplate<classForwardIt,classBinaryPredicate>ForwardItunique(ForwardIt first,ForwardIt last,BinaryPredicate pred);

有志于放开手脚好好研究一番的朋友,观迎参观权威文档:cppreference.com–std::unique

只需要知道,这东西就是个像PPT模板一样。它就是给咱的一套模具,让咱不用管那些外壳形状之类的事情,更加专注于内容。

有了这个模板,函数功能就会变强。

强在哪里呢?

正常我们写一个函数,都要预先指定其参数类型,函数返回值。这个参数类型和函数返回值必须是具体的、明确的,因此一个函数只能处理一种类型的数据,返回一种类型的返回值。

比如下面这个求和函数,只能用来求int类型的变量的和。

intadd(inta,intb){returna+b;}

有了函数模板就不一样了,它不预先指定函数的参数类型、返回值,而是随便用一串字符表示这是一个对象的类型(至于是什么类型我不管)。这串很随便的字符只起到“占位符”的作用,通俗来讲就是占着茅坑不拉屎。

等到实际调用函数的时候,系统(编辑器)会根据你传入实际参数的数据类型把这些占位符替换掉,然后再去执行。如此一来,我们只需要编写一个函数,就可以处理不同类型的参数,输出不同类型的返回值。

这就像同一个PPT模板,你编辑时可以敲入任何类型的内容一样。

上面的模板是C++标准库为咱定制好的,咱直接拿过来用即可,其实咱也是可以自己写模板的。

二、函数说明

  • 只移除相邻重复元素:如果重复元素不相邻,不会被移除。因此通常先对序列排序。
  • 不真正删除元素:本质上只是移动元素,即将不重复元素前移,所以容器大小不变。如果要彻底删除元素,需要配合容器的erase方法物理删除。
  • 返回值:指向新的逻辑末尾(第一个“无用”元素的位置)。
  • 复杂度:对于非空区间:线性时间,恰好( l a s t − f i r s t ) − 1 (last - first) - 1(lastfirst)1次比较。

三、函数用法

3.1 普通有序数组去重

#include<iostream>#include<algorithm>intmain(){intarr[]={1,1,2,2,2,3,4,4,5};intn=sizeof(arr)/sizeof(arr[0]);// unique 将不重复元素移到前面,返回新末尾指针int*new_end=std::unique(arr,arr+n);// 输出逻辑上的去重结果for(int*p=arr;p!=new_end;++p)std::cout<<*p<<" ";// 输出: 1 2 3 4 5std::cout<<std::endl;// 实际数组内容(后面元素未定义,通常保持原样)// arr 现在可能为 {1,2,3,4,5,3,4,4,5}return0;}

3.2 vector去重

因为vector是动态数组(就是长度可以动态调整的数组),所以去重后可以采用erase方法彻底删除重复元素。

#include<vector>#include<algorithm>std::vector<int>v={1,1,2,2,3,3,3};autoit=std::unique(v.begin(),v.end());v.erase(it,v.end());// 物理删除重复元素// v 变为 {1,2,3}

有关vector的说明参见:cppreference.com–std::vector

http://www.jsqmd.com/news/613847/

相关文章:

  • 2026年聚山梨酯厂家创新服务排行榜 - 速递信息
  • 3D打印螺纹设计革命:Fusion 360专用优化配置文件深度解析
  • 博客标题:智契通项目开发周记(第一周):架构设计与基础环境搭建
  • 基于Qwen3-ForcedAligner-0.6B的小说音频版自动生成系统
  • 网络原理TCP/IP
  • 向量相似度查询结果不一致?深度拆解EF Core 10 QueryTranslation中的L2/Cosine距离计算偏差根源(含IL反编译验证)
  • Phi-3-mini-4k-instruct-gguf应用落地:HR招聘JD智能优化与岗位匹配建议生成
  • 文旅推荐官标杆|海西敦德旅游:珂探长引领小众深度旅行 赋能青海文旅高质量发展 - 深度智识库
  • 【限时技术内参】EF Core团队内部测试报告流出:向量搜索启用后DbContext并发吞吐量下降41%的根因与热修复补丁
  • DataCap实战指南:从多源数据整合到智能可视化的全流程解析
  • 近日作业1
  • AI模型部署总超时?.NET 11新特性——Predictive JIT Warmup + Model Caching策略(仅Windows Server 2022+可用)
  • 基于WPF与LibVLCSharp打造无边框媒体播放器的实践指南
  • RAGAS 了解吗?它的评估指标有哪些?评估流程是怎样的?评估数据如何获取和构造?
  • [Linux][虚拟串口]x一个特殊的字节贤
  • 连续三年获奖!妙手ERP再度荣膺Lazada 2026年跨境「官方认证合作伙伴」 - 跨境小媛
  • 气动角座阀哪家质量好?材质、密封与寿命深度测评 - 品牌推荐大师
  • PHP AI代码扫描落地难题全解(2024最新版LLM+AST双引擎实践白皮书)
  • BetterGI:智能视觉辅助工具,让原神游戏体验更上一层楼
  • 2026年GEO公司哪家好?企业需要关注的四个核心能力 - 速递信息
  • 案例速递|手机摄像头模组底壳检测
  • Axure RP中文语言包:3分钟实现专业原型设计工具完全汉化
  • ESP居然能当 DNS 服务器用?内含NCSI欺骗和DNS劫持实现掏
  • 瑞祥提货凭证使用太麻烦?别急,不妨通过“畅回收”平台进行回收兑现,实测5分钟提现! - 畅回收小程序
  • 三通道交错并联双向Buck-Boost变换器:高效能量双向流动与减小电感电流纹波仿真研究
  • 2026年山东视频号代运营选购指南:3招教你省钱挑对靠谱服务商 - 精选优质企业推荐榜
  • 让开发流程更高效:为 Visual Studio 订阅用户解锁 Syncfusion官
  • 从零开始:5分钟快速搭建企业级GB28181视频监控平台
  • “INMS: Memory Sharing for Large Language Model based Agents“ 论文笔记讶
  • Fan Control风扇控制软件:从噪音难题到散热优化的全方位解决方案