c++ unique函数

article/2025/9/29 2:45:45

unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。

函数原型

unique函数的函数原型如下:

只有两个参数,且参数类型都是迭代器:

iterator unique(iterator it_1,iterator it_2);

这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。

函数用法实例

上面介绍了unique函数的功能和原型,那么,它到底是如何进行去重的呢?即“删除”的具体操作是怎样的呢?

unique函数是完全等价于下面这个函数的:

iterator My_Unique (iterator first, iterator last)
{if (first==last) return last;iterator result = first;while (++first != last){if (!(*result == *first)) *(++result)=*first;}return ++result;
}

分析这段代码,我们可以知道,unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。有了这段代码我们可以结合实例来更好的理解这个函数了。

实例:

#include<iostream>
#include<algorithm>
#include<cassert>
using namespace std;static bool myfunc(int i, int j)
{return (i + 1) == j;//return i == j;
}
int main()
{vector<int> a = {1,3,3,4,5,6,6,7};vector<int>::iterator it_1 = a.begin();vector<int>::iterator it_2 = a.end();//sort(it_1,it_2);cout<<"去重前的 a : ";for(int i = 0 ; i < a.size(); i++)cout<<a[i];cout<<endl;//it_h = unique(it_1,it_2);//unique(it_1,it_2,myfunc);unique(it_1,it_2);cout<<"去重后的 a : ";for(int i = 0 ; i < a.size(); i++)cout<<a[i];cout<<endl;
}

运行结果如下:

在这里插入图片描述
对于上面的结果,我们可以看到,容器中不重复的元素都移到了前面,至于后面的元素,实际上并没有改变(这个过程只需结合My_Unique函数来分析即可)。

注:

1.有很多文章说的是,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来。

2.一定不要忘记的是,unique函数在使用前需要对容器中的元素进行排序(当然不是必须的,但我们绝大数情况下需要这么做),由于本例中的元素已经是排好序的,所以此处我没排序,但实际使用中不要忘记。

unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)关于erase函数的用法。下面是一个具体的实例:

#include<iostream>
#include<algorithm>
#include<cassert>
using namespace std;int main()
{vector<int> a ={1,3,3,4,5,6,6,7};vector<int>::iterator it_1 = a.begin();vector<int>::iterator it_2 = a.end();vector<int>::iterator new_end;new_end = unique(it_1,it_2); //注意unique的返回值a.erase(new_end,it_2);cout<<"删除重复元素后的 a : ";for(int i = 0 ; i < a.size(); i++)cout<<a[i];cout<<endl;
}

运行结果如下:

在这里插入图片描述

可以看到,相比之前的结果,a的长度确实发生了改变,真正的删除了a中的重复元素。


http://chatgpt.dhexx.cn/article/CmgMAll5.shtml

相关文章

ubuntu启动后一直黑屏

好奇怪的一件事&#xff0c;昨晚使用完ubuntu后&#xff0c;和往常一样拍了快照&#xff0c;但今天打开后就一直黑屏&#xff0c;就突然的有了自己的思想&#xff0c;任我重启电脑都没有任何用处 我采用的方法 徽标cmd回车&#xff0c;输入如下命令,然后重启电脑 netsh winsoc…

ubuntu虚拟机开机黑屏系列解决办法

ubuntu虚拟机开机黑屏系列解决办法 前记解决方法方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;方法四&#xff1a;方法五&#xff1a;方法六&#xff1a; 后记 前记 ubuntu虚拟机玩的好好的&#xff0c;突然不知怎么着图形界面就卡住了&#xff0c;等待了好一会也不…

记录ubuntu启动黑屏,仅有左上角光标闪烁的解决过程

去年装完显卡驱动后有重启黑屏的经历&#xff0c;所以后来一直没敢装显卡驱动&#xff0c;前段时间需要用显卡驱动跑程序&#xff0c;又装了一次&#xff0c;果不其然黑屏了。 nvidia-smi 是可以显示出显卡信息的&#xff0c;这说明显卡驱动是装上了。 1.首先是试了18 20 22的…

ubuntu虚拟机启动失败黑屏解决方案及原因

背景介绍 某天某个时辰,手残的我想打开VMWare里面的ubuntu虚拟机跑跑Kubernetes突然发现ubuntu虚拟机黑屏无法启动,只有一个光标在闪烁,图形界面就再也打不开了 原因 进入高级模式后发现磁盘占用满了,清除一些文件后ubuntu虚拟机正常启动 解决方案 进入grub模式 一旦启动后…

Ubuntu18的bug导致系统启动后黑屏的问题

这是我在使用Ubuntu18时遇到的问题&#xff0c;文章包含遇到黑屏时的各种原因及解决方法&#xff08;或链接&#xff09;&#xff0c;如果是您在使用Ubuntu18时遇到此问题&#xff0c;建议直接跳转到解决方法处。 问题背景 使用系统 Ubuntu 18.04.1 LTS&#xff08;可以通过…

Ubuntu16.04开机后黑屏无法进入系统登陆界面

之前在写小论文&#xff0c;接近一个月没有用Ubuntu&#xff0c;结果想要切换到Linux下使用Hadoop的时候&#xff0c;在grub界面选择第一项Ubuntu却迟迟无法进入登陆界面&#xff0c;一直卡在原地&#xff0c;特征为长久黑屏/紫屏无响应&#xff0c;无法按ctrlaltF1进入命令行以…

ubuntu启动失败黑屏解决方案

现象 启动直接进入黑屏,左上角有光标但不闪烁,ctrl+alt+fx也无法进入命令行界面 异常前操作 在有程序安装过程中直接reboot,接着就一直如此 最终解决 尝试了很多网上的方法,包括进入grub后按e改磁盘ro为rw啊,进入recovery模式该grub配置啊等等都无效,后来发现这种操…

Ubuntu 20.04 - 21.10进入桌面后黑屏的解决思路+经验总结

引言 之前用Ubuntu 20.04 时候三天两头喜欢折腾功能&#xff0c;每次一折腾完Linux就喜欢要么这里要么哪里撂挑子&#xff0c;进入系统后黑屏就是其中最大的一个问题。 回想刚开始用Linux的小白时期&#xff0c;第一次遇到进入系统后黑屏的时候&#xff0c;虽然之前就听说过桌…

Ubuntu20.04 启动卡在黑屏的解决方法

最近在VM中新安装了Ubuntu20.04&#xff0c;悲催的是启动后一直卡在黑屏&#xff1b;在坑里爬了几天后&#xff0c;终于出坑&#xff1b; 以下是整理的实际操作步骤&#xff0c;希望若有入坑的尽快出坑&#xff1b; 1、启动虚拟机时&#xff0c;进入Grub画面选择相应内核启动…

ubuntu 开机黑屏 解决方案 之一(filesystem readonly)

起因 &#xff1a; 由于本人有不关机的习惯&#xff0c;最近几次早上到公司工作&#xff0c;发现电脑都处于假死状态&#xff0c;显示屏永远处于屏保画面。只好重新启动&#xff0c;但是启动之后 电脑就黑屏&#xff0c;彻彻底底的黑屏&#xff0c;什么都看不到。 解决方案&…

ubuntu启动时黑屏,无法进入登录界面

方式1 1、重新启动客户机 2、点击屏幕立即长按左shift键或ESC 3、出现grub菜单后选择第二个 4、又出现一个列表继续选择第二个 5、下一个页面选择第一个 6、下一个界面点击OK就可以了&#xff0c;但不能保证下次开机时能不能进入 方式2 在vmware中的ubuntu开机时黑屏&#xf…

Ubuntu开机黑屏原因及解决(recovery Mode)

目录 问题描述 解决方法 步骤一 步骤2 总结 恢复模式 问题描述 Linux版本&#xff1a;Ubuntu 16.04 VMware workstation版本&#xff1a; 15 点击启动虚拟机后&#xff0c;经过长时间的等待 (大概2min&#xff0c;正常只需要十几秒)后&#xff0c;显示黑屏&#xff0c…

ubuntu20.04开机黑屏解决方法

问题&#xff1a;开机选择ubuntu20.04系统后&#xff0c;在应显示系统登录界面时黑屏&#xff0c;仅有光标闪烁。如等待时间较久&#xff0c;可能出现ppm init failed -110的错误信息。 情况描述&#xff1a;出现开机问题以来重装过几次系统&#xff0c;换过不同版本的驱动程序…

Ubuntu Linux开机黑屏的永久解决办法

开机之后&#xff0c;没有图形界面&#xff0c;也无法使用命令窗口界面。 解决办法1 对你的电脑来说&#xff0c;这种办法可能只是暂时的解决。重启之后可能又出现黑屏。如果是这样&#xff0c;可以看解决办法2。 因为此时电脑其实是已经可以联网的&#xff0c;如果你之前已…

安装完ubuntu系统在重启时因黑屏启动不了的解决办法

刚安装完ubuntu20.04系统重启时黑屏启动不了的解决办法 码字不易&#xff0c;希望大家能多多关注微信公众号&#xff1a;雨中算法屋&#xff0c;交流更多ubuntu系统的使用和更多算法知识研讨&#xff0c;共同学习&#xff0c;一起进步&#xff0c;有问题也可以关注公众号加我微…

Java 堆栈分析,堆栈区别。

一、栈 1.存放基本变量类型(会包含基本类型的具体数值) 2.引用对象的变量&#xff08;会存放引用在堆里面的具体的地址) 二、堆 1.存放new 对象和数组 2。可以被所有线程共享&#xff0c;不会被别的对象引用。 三、图解 视频教程点击跳转

堆栈的定义和区别

在日常工作中&#xff0c;我们时常会说到堆栈。虽然堆栈总是一起说起&#xff0c;但是实际上这是两个不同的概念。 1. 堆栈的简单理解 首先简单来说呢&#xff0c;堆和栈都在RAM中&#xff0c;一般被分配的区域也是相同的一块区域&#xff0c;只是堆从下往上存储&#xff0c;…

堆栈之间的差别

1、栈中的对象可以共享&#xff1b; 堆中的对象不可以共享。 2、栈中的数据大小和生命周期是可以确定的&#xff0c;当没有引用指向数据时&#xff0c;这个数据就会消失。 堆中的数据大小和生命周期不需要确定&#xff0c;堆中对象由垃圾回收器负责回收。 3、栈中存一些基本类型…

堆栈与队列的区别

开发工具与关键技术&#xff1a;Visual Studio 2015 堆栈与队列的区别 作者&#xff1a;廖 茂 撰写时间&#xff1a;2019年05月06日在数据结构与算法中&#xff0c;有着堆栈和队列&#xff0c;这两种算法在我们的平时软件开发中是需要用到的&#xff0c;首先我们来看一下堆栈…

堆栈主要区别

【C/C】 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数名&#xff0c;局部变量的名等。 2、堆区&#xff08;heap&#xff09;— 由程序员分配释放&#xff0c; 若程序员不释放&…