C++ STL之unique函数

本文详细解析了STL中unique算法的工作原理与应用,该算法用于去除容器中相邻的重复元素,通过重排元素并返回无重复元素范围的结束迭代器,实现高效去重。文章通过示例代码展示了如何结合sort与unique函数进行去重操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素

该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。

在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。

若调用sort后,vector的对象的元素按次序排列如下:

sort  jumps  over quick  red  red  slow  the  the turtle

则调用unique后,vector中存储的内容是:

 

注意,words的大小并没有改变,依然保存着10个元素;只是这些元素的顺序改变了。调用unique“删除”了相邻的重复值。给“删除”加上引号是因为unique实际上并没有删除任何元素,而是将无重复的元素复制到序列的前段,从而覆盖相邻的重复元素。unique返回的迭代器指向超出无重复的元素范围末端的下一个位置。

注意:算法不直接修改容器的大小。如果需要添加或删除元素,则必须使用容器操作。

example:

#include <iostream>
#include <cassert>
#include <algorithm>
#include <vector>
#include <string>
#include <iterator>
 using namespace std;

 int main()
{
    //cout<<"Illustrating the generic unique algorithm."<<endl;
    const int N=11;
    int array1[N]={1,2,0,3,3,0,7,7,7,0,8};
    vector<int> vector1;
    for (int i=0;i<N;++i)
        vector1.push_back(array1[i]);

    vector<int>::iterator new_end;
    new_end=unique(vector1.begin(),vector1.end());    //"删除"相邻的重复元素
    assert(vector1.size()==N);

    vector1.erase(new_end,vector1.end());  //删除(真正的删除)重复的元素
    copy(vector1.begin(),vector1.end(),ostream_iterator<int>(cout," "));
    cout<<endl;

    return 0;
}

运行结果为:

原文地址:https://www.cnblogs.com/heyonggang/p/3243477.html

<think>好的,我现在需要回答用户关于C++中vector是否具有unique函数以及如何使用的问题。首先,我要确认用户的问题点:他们想知道vector是否有unique函数,以及如何正确使用它。根据提供的引用资料,特别是引用[1]、[2]、[3]、[5],可以知道C++unique函数属于STL算法,需要包含<algorithm>头文件。 接下来,我需要整理unique函数的使用步骤。根据引用内容,unique通常与sort和erase结合使用。首先必须对vector进行排序,因为unique只能处理相邻的重复元素。排序后,使用unique将重复元素移到末尾,并返回指向新逻辑结尾的迭代器。然后,使用erase方法删除这些多余的元素。 用户可能需要一个具体的示例,所以我应该参考引用中的代码,比如引用[1]中的示例,将其简化并解释每个步骤的作用。同时,需要指出unique并非vector的成员函数,而是STL算法,因此使用方式是通过std::unique调用,并且需要传入迭代器参数。 另外,要注意强调unique不会真正删除元素,只是移动它们的位置,所以必须配合erase才能改变vector的大小。这点在引用[5]中有提到,需要明确说明。 最后,生成相关问题时要围绕unique的使用场景、注意事项、与其他函数的配合等,帮助用户进一步理解。例如,询问为何需要先排序,或者如何处理自定义类型的去重。</think>### C++中vector使用std::unique函数的完整指南 #### 1. 核心结论 C++的$std::vector$容器本身**没有成员函数unique()**,但可以通过STL算法中的$std::unique()$函数实现元素去重,需要包含头文件$<algorithm>$[^2][^5]。 #### 2. 使用步骤 1. **排序容器**:先对vector进行排序,使相同元素相邻 ```cpp std::sort(v.begin(), v.end()); ``` 2. **应用unique**:移动重复元素到容器尾部 ```cpp auto last = std::unique(v.begin(), v.end()); ``` 3. **删除元素**:擦除尾部重复元素 ```cpp v.erase(last, v.end()); ``` #### 3. 完整示例 ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v{3,4,5,1,2,5,3}; // 必须排序! std::sort(v.begin(), v.end()); // 得到1 2 3 3 4 5 5 // 移动重复元素到末尾,返回新结尾迭代器 auto new_end = std::unique(v.begin(), v.end()); // 物理删除重复元素 v.erase(new_end, v.end()); // 输出结果:1 2 3 4 5 for(int n : v) std::cout << n << ' '; } ``` #### 4. 关键特性 - **时间复杂度**:$O(n)$(已排序容器)[^5] - **返回值**:指向唯一序列末尾后一位的迭代器[^3] - **注意事项**: - 必须**先排序**才能完全去重[^1] - 不会改变容器容量,仅修改元素位置[^5] - 支持自定义比较器(处理对象去重时常用) #### 5. 自定义类型去重 对于结构体/类对象,需要重载$operator==$或提供谓词: ```cpp struct Person { int id; std::string name; bool operator==(const Person& o) const { return id == o.id; } }; // 使用示例 std::unique(v.begin(), v.end(), [](const Person& a, const Person& b){ return a.id == b.id; }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值