c++STL函数中的unique函数

本文介绍了C++中unique函数的基本用法及注意事项。通过实例演示了如何利用unique函数去除已排序容器中的重复元素,并详细解释了该函数如何通过向左覆盖重复元素来达到去重效果。同时介绍了unique函数返回值的意义及其在实际应用中的作用。

头文件是include<iostream.h>

举个例子:

int num[10] = { 1,1,2,2,2,3,4,5,5,5 };
int ans = unique(num, num + 10) - num;

先有一个已经排好序的容器,里面会有重复的数字,使用unique函数,会使重复的元素从右向左开始覆盖,最后得到

新的数组:
1,2,3,4,5,3,4,5,5,5
而unique(num,num+10)返回的是去重之后的尾地址。
在《c++标准程序库》中有写到:
1.将原本位置在后的未移除元素向前移动,覆盖被移除元素;
2.未移除元素在相对次序上保持不变。
C++ STL中的`unique`函数用于从序列中移除相邻的重复元素,常用于容器(如`vector`、`list`等)或数组范围中。需要注意的是,该函数仅移除相邻的重复项,而不是整个范围内的重复项。如果希望移除所有重复元素,通常需要先对序列进行排序[^1]。 ### 功能描述 `unique`函数的基本功能是遍历指定范围,并比较相邻的元素。如果两个相邻元素相等,则保留第一个元素,而后续的重复元素会被移动到范围的末尾。函数返回一个迭代器,指向最后一个不重复元素之后的位置。可以通过结合`erase`方法删除这些重复元素。 ### 使用示例 以下是一个使用`vector`的示例: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 5, 5}; // 使用unique处理相邻重复元素 auto new_end = std::unique(vec.begin(), vec.end()); // 删除重复元素 vec.erase(new_end, vec.end()); // 打印结果 for (int i : vec) { std::cout << i << " "; } return 0; } ``` 输出结果为: ``` 1 2 3 4 5 ``` ### 与排序结合使用 为了移除所有重复元素(而不仅仅是相邻的),可以先对容器进行排序: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {3, 1, 2, 3, 2, 4, 5, 1}; // 先排序 std::sort(vec.begin(), vec.end()); // 使用unique处理相邻重复元素 auto new_end = std::unique(vec.begin(), vec.end()); // 删除重复元素 vec.erase(new_end, vec.end()); // 打印结果 for (int i : vec) { std::cout << i << " "; } return 0; } ``` 输出结果为: ``` 1 2 3 4 5 ``` ### 自定义比较函数 `unique`还支持自定义比较函数,以定义元素是否相等。例如: ```cpp #include <iostream> #include <vector> #include <algorithm> bool custom_compare(int a, int b) { return a == b; // 自定义比较逻辑 } int main() { std::vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 5, 5}; // 使用自定义比较函数 auto new_end = std::unique(vec.begin(), vec.end(), custom_compare); // 删除重复元素 vec.erase(new_end, vec.end()); // 打印结果 for (int i : vec) { std::cout << i << " "; } return 0; } ``` 输出结果为: ``` 1 2 3 4 5 ``` ### 注意事项 - `unique`仅移除相邻的重复元素,因此在处理非排序数据时可能需要结合排序。 - 该函数不会真正删除元素,而是将重复元素移动到范围末尾,需结合`erase`方法进行删除。 - `unique`的时间复杂度为线性,即O(n),其中n为范围内的元素数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值