STL之vector去重三步曲(利用unique函数)

       unique()函数作用是“去掉”容器中相邻元素的重复元素,然后返回指向第一个重复元素的迭代器。unique()实质上是一个伪去除,它并不是真正把重复的元素删除,而是用不重复的元素把重复的元素覆盖了,所以总长度其实是不变的。

       因此在利用unique()函数前需要对容器内的数据排序,可以通过sort()函数实现。sort()函数的作用是对容器指定范围内的元素按指定格式进行排序,默认从小到大。

       在利用unique()函数后需要擦除从返回的迭代器对于的元素到最后元素的所有的元素,可以通过erase()函数实现。erase()函数的作用是擦除容器指定范围内的元素。

       另外需要说明的是:

  • sort()函数的头文件为:#include <algorithm>
  • unique()函数的头文件为:#include <iostream>
  • erase()函数为容器对象自身的操作,包含头文件:#include <vector>   即可
  •  一般情况下,三个函数均只需要传入两个参数(两个迭代器/地址,且左闭右开)。

       综上:主要思路为,先排序,再唯一,最后删除最后面的那段“重复”元素。

举例:

先构造这样一个vector

    int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
    vector<int> goal(construct, construct+10);        // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9

①首先将vector排序

    sort(goal.begin(), goal.end());                    // 1, 2, 3, 3, 4, 4, 6, 7, 8, 9

②然后使用unique算法,unique返回值是重复元素的开始位置

    auto pos = unique(goal.begin(), goal.end());    // 1, 2, 3, 4, 6, 7, 8, 9, 3, 4
                                         //                       ^

③最后删除后面的那段重复部分

    goal.erase(pos, goal.end());                    // 1, 2, 3, 4, 6, 7, 8, 9

完整代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
    vector<int> goal(construct, construct+10);        // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
    sort(goal.begin(), goal.end());                    // 1, 2, 3, 3, 4, 4, 6, 7, 8, 9
    auto pos = unique(goal.begin(), goal.end());    // 1, 2, 3, 4, 6, 7, 8, 9, 3, 4
    goal.erase(pos, goal.end());                    // 1, 2, 3, 4, 6, 7, 8, 9
    for(int it : goal)
        cout << it << ' ';
    return 0;
}

       另外对于一些容器中数据类型,如结构体、类等,为了实现去重操作,还可以通过对sort算法需要重载“<”操作符、对unique算法需要重载“==”操作符,通过对其中的某一成员变量进行操作来实现。

       对vector的去重操作还可以利用set容器的特性实现,思路比较简单,在此不再说明,直接用代码举例如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int main()
{
    int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
    vector<int> goal(construct, construct+10);        // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
    set<int> temp(goal.begin(), goal.end());           // 1, 2, 3, 4, 6, 7, 8, 9
    goal.assign(temp.begin(), temp.end());            // 1, 2, 3, 4, 6, 7, 8, 9
    for(int it : goal)
        cout << it << ' ';
    return 0;
}

       注意:通过上述两种方法得到的结果均为排序后的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

使君杭千秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值