您的位置:

C++中unique的使用详解

一、去重的原理

C++标准库中的unique算法可以去除相邻的重复元素,这种去重的原理是依次检查相邻两个元素是否相等,如果相等就删除后面的元素,直到检测完所有元素为止。unique算法并没有改变容器中的大小,同时返回去重后的尾指针,可以通过该指针得知去重后容器中元素的个数。

二、不同容器的用法

1. vector


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector
    v = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
    auto it = unique(v.begin(), v.end());
    v.erase(it, v.end());

    for(auto i : v)
        cout << i << " ";

    return 0;
}

   

上述代码构造了一个vector,然后调用unique算法,实现了去重操作,最后输出去重后的vector元素。

2. list


#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

int main()
{
    list
    l = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
    l.unique();

    for(auto i : l)
        cout << i << " ";

    return 0;
}

   

list的去重操作可以在list容器对象上直接调用unique函数实现,这是因为list容器内部实现了去重操作。

3. set


#include <iostream>
#include <set>

using namespace std;

int main()
{
    set
    s = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};

    for(auto i : s)
        cout << i << " ";

    return 0;
}

   

set容器本身就具有去重的功能,重复元素将无法插入到set容器中,因此只需将元素插入set容器中即可实现去重操作。

三、关键字去重

以上的去重算法都是比较元素是否相等来进行去重的,然而在关键字去重的场景下,会根据元素的某些属性进行去重。此时需要自定义去重判断的方法。


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Person
{
    string name;
    int age;
    bool operator==(const Person &p) const
    {
        return name == p.name && age == p.age;
    }
};

int main()
{
    vector<Person> v = {{"张三", 20}, {"李四", 22}, {"张三", 20}, {"王五", 25}, {"李四", 22}};
    auto it = unique(v.begin(), v.end(), [](const Person &p1, const Person &p2) {return p1 == p2;});
    v.erase(it, v.end());

    for(auto i : v)
        cout << i.name << " " << i.age << endl;

    return 0;
}

上述代码中自定义了Person结构体,然后在unique算法中使用了lambda表达式,重载了判断规则,实现了按照Person结构体中的name和age属性进行去重操作。

四、使用场景

unique算法在实际开发中的使用场景较多,例如:

1.去除重复的网络请求数据;

2.对算法重复输出的结果进行去重;

3.多通道信号过滤;

4.等等。

总结

本文详细介绍了C++标准库中的unique算法,包括去重原理、在不同容器中的使用以及关键字去重方法,同时给出了使用场景。unique算法的使用可以大大简化代码,提高开发效率。