C++数组去重可通过多种方法实现:1. 使用std::set自动排序去重;2. 结合std::sort与std::unique原地去重;3. 手动遍历适合小数组;4. std::unordered_set哈希去重保序高效。

在C++中,数组本身是固定大小的静态结构,不能直接“删除”元素。但可以通过一些方法实现数组去重的效果,即保留唯一元素并重新组织数据。以下是几种常见的C++数组去重方法。
1. 使用 std::set 去重
std::set 容器自动保持元素唯一且有序,适合用于去重。步骤:
- 将数组元素插入 set 中,自动去重并排序。
- 再将 set 中的元素复制回数组或 vector。
#include <iostream>
#include <set>
#include <vector>
int main() {
int arr[] = {5, 2, 8, 2, 5, 3};
int n = sizeof(arr) / sizeof(arr[0]);
std::set<int> unique_set(arr, arr + n);
std::vector<int> result(unique_set.begin(), unique_set.end());
for (int x : result) {
std::cout << x << " ";
}
return 0;
}
输出:2 3 5 8
2. 使用 std::sort 和 std::unique
这是最常用的方法之一,适用于原地去重(配合 vector 使用)。说明:
立即学习“C++免费学习笔记(深入)”;
- 先对数组排序。
- 使用 std::unique 将重复元素移到末尾。
- 通过迭代器获取不重复部分。
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 2, 8, 2, 5, 3};
std::sort(vec.begin(), vec.end());
auto last = std::unique(vec.begin(), vec.end());
vec.erase(last, vec.end());
for (int x : vec) {
std::cout << x << " ";
}
return 0;
}
输出:2 3 5 8
3. 手动遍历去重(适用于小数组)
如果不想排序或使用STL容器,可以手动检查每个元素是否已存在。思路:
- 新建一个结果数组或vector。
- 遍历原数组,若当前元素不在结果中,则添加。
#include <iostream>
#include <vector>
bool contains(const std::vector<int>& vec, int value) {
for (int x : vec) {
if (x == value) return true;
}
return false;
}
int main() {
int arr[] = {5, 2, 8, 2, 5, 3};
int n = sizeof(arr) / sizeof(arr[0]);
std::vector<int> result;
for (int i = 0; i < n; ++i) {
if (!contains(result, arr[i])) {
result.push_back(arr[i]);
}
}
for (int x : result) {
std::cout << x << " ";
}
return 0;
}
输出顺序可能为:5 2 8 3(保持原始顺序)
4. 使用 std::unordered_set 提高效率
结合哈希表实现 O(1) 查找,适合大数组且希望保持插入顺序。做法:
- 用 unordered_set 记录已出现的元素。
- 遍历原数组,未出现过的加入结果和集合。
#include <iostream>
#include <unordered_set>
#include <vector>
int main() {
int arr[] = {5, 2, 8, 2, 5, 3};
int n = sizeof(arr) / sizeof(arr[0]);
std::vector<int> result;
std::unordered_set<int> seen;
for (int i = 0; i < n; ++i) {
if (seen.find(arr[i]) == seen.end()) {
seen.insert(arr[i]);
result.push_back(arr[i]);
}
}
for (int x : result) {
std::cout << x << " ";
}
return 0;
}
输出:5 2 8 3(保持首次出现顺序)
基本上就这些常见方法。根据是否需要保持顺序、是否允许排序、性能要求等选择合适方案。std::unique 配合排序适合大多数情况;unordered_set 更高效且保序;set 自动排序去重;手动方法灵活但慢。实际开发中推荐使用 STL 算法提高效率和可读性。











