news 2026/5/11 22:28:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 17:19:14

免配置镜像部署:Ostrakon-VL像素终端Docker一键拉取与启动步骤详解

免配置镜像部署&#xff1a;Ostrakon-VL像素终端Docker一键拉取与启动步骤详解 1. 项目概览 Ostrakon-VL像素终端是一款专为零售与餐饮行业设计的AI视觉识别工具&#xff0c;采用独特的8-bit像素风格界面&#xff0c;将复杂的图像识别任务转化为直观有趣的"数据扫描&quo…

作者头像 李华
网站建设 2026/4/9 17:14:51

2026届必备的降AI率神器实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在人工智能生成内容越来越普及的这种背景状况下&#xff0c;降AIGC工具就相应地产生了&#…

作者头像 李华
网站建设 2026/4/9 17:13:15

如何用Input Leap实现跨设备控制?打造无缝多设备协作体验

如何用Input Leap实现跨设备控制&#xff1f;打造无缝多设备协作体验 【免费下载链接】input-leap Open-source KVM software 项目地址: https://gitcode.com/gh_mirrors/in/input-leap 在多设备办公环境中&#xff0c;频繁切换键盘鼠标不仅打断工作流&#xff0c;更降低…

作者头像 李华
网站建设 2026/4/9 17:08:18

阿里:技能正文决定Agent路由精度

&#x1f4d6;标题&#xff1a;SkillRouter: Retrieve-and-Rerank Skill Selection for LLM Agents at Scale &#x1f310;来源&#xff1a;arXiv, 2603.22455v1 &#x1f31f;摘要 随着LLM代理生态系统的发展&#xff0c;可用技能的数量&#xff08;工具&#xff0c;插件&…

作者头像 李华