unique()
是C++标准库中一个非常实用的算法,用于去除相邻的重复元素。使用它之前需要先引入必须包含的头文件:
#include<algorithm>
基本语法
#include <algorithm> // 必须包含的头文件
// 最常见的两种形式:
iterator unique(iterator first, iterator last);
iterator unique(iterator first, iterator last, BinaryPredicate p);
参数说明
参数 | 说明 |
---|---|
first, last | 前向迭代器,指定要处理的序列范围 [first, last) |
p | 二元谓词(可选),自定义比较规则:bool p(const Type1 &a, const Type2 &b) |
返回值
返回一个指向新区间末尾的迭代器,这个迭代器指向的是去重后最后一个有效元素的下一个位置。
重要:unique()
只是将重复元素移到容器末尾,并不会改变容器的大小!
用法示例
对数组去重
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {1, 2, 2, 3, 3, 3, 4, 5, 5};
int n = sizeof(arr) / sizeof(arr[0]);
// 使用 unique
auto it = unique(arr, arr + n);
// 输出去重后的结果
cout << "去重后的数组:";
for (int i = 0; i < it - arr; i++) {
cout << arr[i] << " ";
}
// 输出:1 2 3 4 5
cout << endl;
// 剩余的元素(被移动的重复元素)
cout << "被移动的元素:";
for (int i = it - arr; i < n; i++) {
cout << arr[i] << " ";
}
// 输出:3 5 5(这些值是不确定的)
return 0;
}
对vector去重
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 5, 5};
// 先排序(unique只处理相邻重复元素)
sort(vec.begin(), vec.end());
// 使用 unique 并真正删除重复元素
auto it = unique(vec.begin(), vec.end());
vec.erase(it, vec.end()); // 重要:删除末尾的重复元素
// 输出去重后的vector
cout << "去重后的vector:";
for (int num : vec) {
cout << num << " ";
}
// 输出:1 2 3 4 5
return 0;
}
使用自定义比较规则
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool ignoreCase(char a, char b) {
return tolower(a) == tolower(b);
}
int main() {
vector<char> chars = {'A', 'a', 'B', 'b', 'C', 'c'};
// 使用自定义比较函数(忽略大小写)
auto it = unique(chars.begin(), chars.end(), ignoreCase);
chars.erase(it, chars.end());
cout << "忽略大小写去重:";
for (char c : chars) {
cout << c << " ";
}
// 输出:A B C
return 0;
}
注意事项
- 必须排序:unique() 只移除相邻的重复元素,所以通常需要先 sort()
- 不改变容器大小:需要手动 erase() 或使用新长度
- 时间复杂度:O(n),线性时间
- 稳定性:保留第一个出现的元素,移除后续的重复项
获取去重长度
下面这段代码的作用是计算数组啊a从第1个到第n个元素去重后的元素个数,并将结果存储在变量 cnt 中。
cnt = unique(a+1,a+n+1)-(a+1);