C++中的unique函数

本文介绍了STL中unique函数的用法,该函数用于移除容器中相邻的重复元素,并将其余元素重新排列。文章详细解释了如何通过结合sort、unique及erase函数来实现数组的完全去重操作。

STL中的unique函数的头文件:

#include<iostream>

unique 的作用是“去掉”容器中相邻元素的重复元素,这里所说的“去掉”并不是真正把重复元素删除,它实质上是一个伪去除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址。
因为unique去除的是相邻元素的重复元素,所以使用之前需要排序。

sort, unique和erase的联合使用,可以将一个有重复元素的数组的重复元素去除,从而转化成一个无重复元素的有序数组。

end_unnique = unique(result.begin(), result.end());
result.erase(end_unique, result.end());

由于 end_unique返回去重后最后一个元素的位置,而重复的元素都被移动到后面去了,所以要将从去重后最后一个元素的地址 到 原数组最后一个地址 这些地址中的元素去掉,从而得到无重复元素的数组。

reference:
http://blog.youkuaiyun.com/laoma023012/article/details/51966238

<think>好的,我现在需要帮助用户了解C++中的unique函数的使用方法和示例。首先,我得回忆一下自己对这个函数的了解。unique函数属于STL算法库,主要用于去除相邻的重复元素。不过要注意,它并不会真正删除元素,而是将不重复的元素移动到前面,并返回新的逻辑尾端迭代器。用户可能需要知道使用前必须先排序,否则可能无法正确去重,因为unique只处理相邻的重复。 接下来,我需要参考用户提供的引用内容。引用中提到了多个示例,比如使用unique前必须排序,以及如何计算去重后的长度。比如引用1和引用2都展示了先排序数组,然后使用unique,再通过减去首地址得到长度。引用5也提到unique只是移动元素,并没有真正删除,所以通常需要结合容器的erase方法来实际删除多余元素,这在引用4的vector示例中有所体现。 用户可能想知道的具体问题包括:函数的基本用法、返回值是什么、是否需要排序、如何处理不同类型的容器(比如数组和vector)。同时,用户可能需要示例代码来理解这些步骤。例如,数组的情况和vector的情况可能有不同的处理方式,比如数组需要计算指针差值,而vector需要erase。 需要确保回答的结构清晰,分步骤说明使用方法,可能包括注意事项,比如必须先排序。然后提供示例代码,分别展示数组和vector的应用场景。另外,要解释unique函数的工作原理,强调它只处理相邻元素,因此排序的重要性。 可能还需要提到,unique的返回值是新范围的尾后迭代器,这样用户才能正确截断容器或计算长度。同时,指出unique并不会改变容器的大小,只是重新排列元素,所以对于vector,必须使用erase来实际删除多余元素,否则容器末尾可能还有旧的元素存在。 最后,根据用户的要求,生成相关问题。这些问题可能涉及unique函数的时间复杂度、与其他去重方法的比较、在非排序容器上的行为,或者如何自定义比较函数等。</think>### C++ unique函数详解 #### 一、核心特性 1. **相邻去重**:仅处理相邻重复元素(必须**先排序**才能实现全局去重)[^5] 2. **原地操作**:不删除元素,而是将不重复元素前移,返回新逻辑终点[^5] 3. **算法复杂度**:时间复杂度$O(n)$,空间复杂度$O(1)$ #### 二、使用步骤 1. **排序预处理**:`sort(begin, end)` 2. **执行去重**:`iterator new_end = unique(begin, end)` 3. **容器截断**(可选):`container.erase(new_end, end)` #### 三、代码示例 ```cpp // 数组处理示例 #include <algorithm> #include <iostream> using namespace std; int main() { int arr[] = {2, 8, 2, 4, 8, 7, 6, 4}; // 步骤1:排序(必须) sort(arr, arr + 8); // 排序后:2,2,4,4,6,7,8,8 // 步骤2:去重 int* new_end = unique(arr, arr + 8); // 计算去重后长度 int len = new_end - arr; // len = 6 // 输出结果 cout << "去重后元素: "; for(int i=0; i<len; ++i) cout << arr[i] << " "; // 输出:2 4 6 7 8 } ``` ```cpp // vector处理示例 #include <vector> #include <algorithm> int main() { std::vector<int> vec{2, 2, 4, 4, 6, 7, 8, 8}; // 步骤1:排序(已有序可省略) std::sort(vec.begin(), vec.end()); // 步骤2+3:去重并截断 vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); // 此时vec.size() = 5,内容:2,4,6,7,8 } ``` #### 四、注意事项 1. **必须排序**:未排序时`unique`只能去除连续重复(如`{1,2,1}`处理后仍为`{1,2,1}`) 2. **容器类型**: - 数组:通过指针运算获取长度 - vector:必须配合`erase`才能真正删除元素[^4] 3. **自定义类型**:需重载`==`运算符或提供二元谓词
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值