C++ STL中 unique() 函数(详解)

本文详细介绍了C++中的unique()函数,该函数用于去除数组或容器中相邻的重复元素。它通过将重复元素移到数组末尾而不直接删除,返回新的不重复元素的结束位置。示例代码展示了如何结合sort()使用unique(),以及如何使用vector的erase()函数删除隐藏的重复元素。此外,文章还讨论了unique()函数的实现原理及其返回值的含义。
摘要由CSDN通过智能技术生成
1.unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(注意一定是相邻元素,且只保留一个),所以使用前需要对数组进行排序

那它是怎么实现去重的呢?删除?

不是,它并没有将重复的元素删除,而是把重复的元素放到数组的最后面 藏起来 了

当把原长度的数组整个输出来就会发现
其实是:
在这里插入图片描述

其中 1 2 8 9 10就是去重后的数组,后面的8 9 9 9 10就被“藏起来”了

验证示例:

while (cin>>n)
    {
        for (int i = 0;i < n;++i)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int k = unique(a,a+n) - a;//另一种用法:含义是:对于长度为n的数组a,unique(a,a+n) - a返回的是去重后的数组长度k
        for (int i = 0;i < n;++i)
        {
            printf("%d ",a[i]);
        }
        puts("");
    }

结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YQcKRZyH-1614046121884)(/Users/mac/Library/Application Support/typora-user-images/image-20210223100313368.png)]

2.原理:

原理就是不断的将后面不重复的元素覆盖前面重复的元素,并且返回最后一个不重复元素下一个元素的坐标的(迭代器),因为**end()**指向的是最后一个元素的下一个迭代器

原理代码

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;          // 返回最后不重复元素的下一个元素的坐标的迭代器
}
3.示例:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1000;
int a[N + 5];
int main()
{
    int n;
    while (cin >> n)
    {
        for (int i = 0;i < n;++i) scanf("%d",&a[i]);
        sort (a, a + n);
        vector<int>v (a, a + n);
        vector<int>::iterator it = unique (v.begin(), v.end() );//获得最后不重复元素的下一个元素的坐标的迭代器
        v.erase (it, v.end() );//这里就是把后面“藏起来”的重复元素删除了。就是利用vector把后面藏着的元素删除了
        for ( it = v.begin() ; it != v.end() ; it++ )
        {
            printf ("%d ", *it);
        }
        puts("");
    }
    return 0;
}

结果:
img

4.unique()另一种用法:
k = unique(a,a+n) - a;

含义是:对于长度为L的数组a,unique(a,a+n) - a返回的是去重后的数组长度k

示例

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100000;
int a[N+5];
int main()
{
    int n;
    while (cin>>n)
    {
        for (int i = 0;i < n;++i)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        n = unique(a,a+n) - a;//关键的一句
        for (int i = 0;i < n;++i)
        {
            printf("%d ",a[i]);
        }
        puts("");
    }
    return 0;
}

结果:
在这里插入图片描述

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值