C++vector容器类删除重复元素

vector删除重复元素的思路与方法

一 .相关api

1. unique

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

函数原型

unique有两个函数原型,分别为:

iterator unique(iterator it_1,iterator it_2);

iterator unique(iterator it_1,iterator it_2,bool MyFunc);

相关参数:

  • it_1,it_2 : it_1与it_2it_2s表示在it1与it2之间去重,区间是前闭后开,即不包含it_2所指的元素。
  • MyFunc:可自定义判定相同的函数

注意:unique不会改变容易的长度,只是单纯地把补充的元素提到前面来,另外在使用unique时,最好先对容器进行排序

MyFunc 代码展示

static bool myfunc(int i, int j)
{
    return (i + 1) == j;
    //return i == j;
}

2.sort

sort 函数的功能是对数组或者容器中的内容进行排序

函数原型
sort(begin,end,cmp)
  • begin: 容器的首地址
  • end:排序在哪里结束?
  • cmp :自定义的排序函数

注意:如果不定义cmp,sort函数默认是升序
cmp定义例子:

bool cmp(int a,int b)
{
  return a>b;
}

a>b,就返回1,认为是满足条件,所以这是降序排序的函数

3.earse

函数原型
string& erase ( size_t pos = 0, size_t n = npos );
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );

第一种 :从pos这个位置开始,删除n个字符(从pos开始算起)

第二种: 就删除pos这个位置的一个元素

第三中:从first删除到last (清空first到last这个区间内的东西)

二. 简单情况

当容器中的存储类型是直接可以进行比较的,例如int,float

参考代码

vector<int> sun;
//向sun添加元素
for (int i = 0; i < n; ++i)
{
   sun.push_back(primes[i]);
}
sort(sun.begin(), sun.end());
//使用 erase 删除
sun.erase(unique(sun.begin(), sun.end()), sun.end());

三. 复杂情况

当容器中的存储类型是不可直接比较的,如结构体,一个复杂类的对象。

实际例子

我想删除Vector mataches中,元素trainIndex相同的值。
PS:DMatch类包含几个属性,其中一个就是trainIndex。

解决方案

1.首先用sort函数根据trainIndex值对mataches中的元素进行排序
由于DMatch是一个类,里面包含了多个属性,sort()函数无法直接对其进行排序,sort会有疑问:你有这么多个属性,我该以谁为标准呢? 因此,为了告诉笨蛋sort()该怎么做,我们需要先构建一个函数,来告诉sort根据trainIndex属性来判断大小。

bool cmp(DMatch a, DMatch b)
{
	return a.trainIdx > b.trainIdx;
}

然后就可以直接排序了:

sort(matches.begin(), matches.end(), cmp);

2.删除错误点
排序后,我们就可以使用unique和erase方法来删除重复元素,同样地,unique跟你也没啥默契,你也需要写一个函数告诉他该以谁为标准来进行操作。

bool equal(DMatch a, DMatch b)
{
	return a.trainIdx == b.trainIdx;
}

然后就直接进行删除了

matches.erase(unique(matches.begin(), matches.end(), equal), matches.end())

四.总结

1.删除重复元素的思路为: sort—unique—erase

2. 其实复杂情况的核心步骤跟简单情况大同小异,只是多一个步骤,你需要告诉sort还有uniqiue你的规则是什么,好让对方准确地执行任务,具体操作上,即在排序前,需要自己定义一函数,来说明这些对象究竟怎样才算大,怎样才算小,在使用unique时,也需要自己定义一个函数来说明两个对象究竟满足什么条件才算相等

以上部分内容参考自:
https://www.cnblogs.com/TX980502/p/8528840.html
https://www.cnblogs.com/wangkundentisy/p/9033782.html

发布了16 篇原创文章 · 获赞 4 · 访问量 3906

猜你喜欢

转载自blog.csdn.net/qq_33397016/article/details/90648610