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#include #include int main() { int arr[] = {5, 2, 8, 2, 5, 3}; int n = sizeof(arr) / sizeof(arr[0]); std::set unique_set(arr, arr + n); std::vector 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#include #include int main() { std::vector 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#include bool contains(const std::vector & 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 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#include #include int main() { int arr[] = {5, 2, 8, 2, 5, 3}; int n = sizeof(arr) / sizeof(arr[0]); std::vector result; std::unordered_set 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 算法提高效率和可读性。











