C++ 之vector元素去重unique()


头文件:#include<algorithm>


一、unique()

1.函数原理

函数去重的原理类似于下面这个(来自 http://www.cplusplus.com/reference/algorithm/unique/):

从头到尾,判断当前元素是否等于上一个元素,将不重复的元素移到前面来(赋值操作),而不是将重复的元素移动到后面去。

PS:因为是判断当前元素是否等于上一个元素,所以要去重的容器必须是经过排序的有序容器。

template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
  if (first==last) return last;

  ForwardIterator result = first;
  while (++first != last)
  {
    if (!(*result == *first))  // or: if (!pred(*result,*first)) for version (2)
      *(++result)=*first;
  }
  return ++result;
}

2.函数

(1)原型

ForwardIterator unique(
	ForwardIterator first,
	ForwardIterator last
);
ForwardIterator unique(
	ForwardIterator first,
	ForwardIterator last,
	BinaryPredicate pred
);

(2)参数

  • first:去重的起点的迭代器位置。
  • last:去重的终点的迭代器位置,不包括
  • pred:自定义判断重复方式。

去重区间:[ fist, last )

输入值:有序容器

返回值:去重以后vector中没有重复元素的下一个位置的迭代器。

执行完unique():从容器的开始到返回的迭代器位置的元素是不重复的元素,而从返回的迭代器位置到vector.end()的元素都是没有意义的(这东西就是原来排序后的东西,没变过)。

(3)unique()排序讲解

//unique讲解示例
#include<iostream>
#include <algorithm>
#include <vector> 

using namespace std;

int main() {
	vector<int> v{3,4,5,1,2,5,3};
	
	//排序
	sort(v.begin(), v.end());
	//1 2 3 3 4 5 5
	
	//pos是去重以后vector中没有重复元素的下一个位置的迭代器。
	vector<int>::iterator pos = unique(v.begin(), v.end());

	//去重后整个容器
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << ' ';
	}
	cout << endl;
	//1 2 3 4 5 5 5

	//从容器开始到pos:去重后的容器元素
	for (vector<int>::iterator i = v.begin(); i < pos; i++)
	{
		cout << *i << ' ';
	}
	cout << endl;
	//1 2 3 4 5

	//从pos到容器结束:无意义的元素
	for (vector<int>::iterator i = pos; i < v.end(); i++)
	{
		cout << *i << ' ';
	}
	cout << endl;
	//5 5

	return 0;
}

(4)unique()默认排序使用

erase()擦除无意义的部分

//unique使用示例
#include<iostream>
#include <algorithm>
#include <vector> 

using namespace std;

int main() {
	vector<int> v{3,4,5,1,2,5,3};
	
	sort(v.begin(), v.end());
	//1 2 3 3 4 5 5
	
	vector<int>::iterator pos = unique(v.begin(), v.end());

	v.erase(pos, v.end());

	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << ' ';
	}
	cout << endl;
	//1 2 3 4 5

	return 0;
}

(5)unique()自定义去重使用

类似sort()函数自定义排序方式,使用的时候不写参数,直接myUnique

bool myUnique(int i, int j)
{
	return i == j;
}
//unique自定义示例
#include<iostream>
#include <algorithm>
#include <vector> 

using namespace std;

bool myUnique(int i, int j)
{
	return i == j;
}

int main() {
	vector<int> v{3,4,5,1,2,5,3};
	
	sort(v.begin(), v.end());
	//1 2 3 3 4 5 5
	
	vector<int>::iterator pos = unique(v.begin(), v.end(),myUnique);

	v.erase(pos, v.end());

	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << ' ';
	}
	cout << endl;
	//1 2 3 4 5

	return 0;
}

二、vector去重无序数组且要保持原来的顺序

比如:
1,3,1,7,5,7
结果:
1,3,7,5

原理:就是简单比较当前元素是否出现在当前元素之前的数组中,如果没有才填入。

void print_readingOrder(vector<int> vec)
{
	vector<int> vecprint;
	//第一个元素不用比
	vecprint.push_back(vec[0]);
	for(int i = 1;i<vec.size();i++)
	{
		bool tag=true;
		for(int j =0;j<i;j++)
		{
			if(vec[i]==vec[j])
			{
				tag=false;
				break;
			}
		}
		if(tag==true)	vecprint.push_back(vec[i]);
	
	}
	//控制台输出
	for(int i=0;i<vecprint.size();i++)
	{
		cout<<vecprint[i]<<endl;
	} 
} 

参考:
https://www.cnblogs.com/cxq0017/p/6555533.html

https://www.cnblogs.com/aminxu/p/4686332.html

https://www.cnblogs.com/wangkundentisy/p/9033782.html

  • 24
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值