掌握数组去重是C++程序员的基本功,本文将通过多种方法带你彻底理解这一核心概念
数组去重是C++编程中常见的需求,特别是在数据处理、算法设计和面试场景中。本文将详细介绍多种数组去重方法,从最基础的双重循环到利用STL容器的高级技巧,每种方法都包含完整的代码示例和详细解释。
一、数组去重的基本概念
数组去重是指从数组中移除所有重复的元素,使得每个元素在数组中只出现一次。例如,将数组 [1, 2, 2, 3, 4, 4, 5]
去重后得到 [1, 2, 3, 4, 5]
。
在实际应用中,数组去重可以:
- 提高数据处理的效率
- 减少存储空间的占用
- 保证数据的唯一性和准确性
- 为后续算法(如排序、查找)提供清洁的数据基础
二、基础方法:双重循环遍历
这是最直观的去重方法,适合初学者理解去重的本质原理。
2.1 实现原理
通过双重循环遍历数组,外层循环逐个选择元素,内层循环检查该元素后续是否出现重复。如果找到重复元素,则将其删除。
2.2 完整代码实现
#include <iostream>
#include <vector>
using namespace std;
vector<int> removeDuplicates(vector<int>& arr) {
// 复制原数组,避免修改原始数据
vector<int> result = arr;
for (int i = 0; i < result.size(); i++) {
for (int j = i + 1; j < result.size(); j++) {
if (result[i] == result[j]) {
// 删除重复元素
result.erase(result.begin() + j);
j--;// 调整索引,因为删除了元素
}
}
}
return result;
}
int main() {
vector<int> arr = {
1, 2, 2, 3, 4, 4, 5, 1, 3};
vector<int> uniqueArr = removeDuplicates(arr);
cout << "原数组: ";
for (int num : arr) {
cout << num << " ";
}
cout << endl;
cout << "去重后: ";
for (int num : uniqueArr) {
cout << num << " ";
}
cout << endl;
return 0;
}
2.3 方法分析
优点:
- 原理简单,易于理解
- 不依赖额外的数据结构
缺点:
- 时间复杂度为O(n²),效率较低
- 需要移动元素,删除操作效率不高
三、使用标准模板库(STL)的方法
C++标准库提供了丰富的容器和算法,可以更高效地实现数组去重。
3.1 使用set容器
Set是STL中的关联容器,它的特点是
元素唯一且自动排序
,非常适合去重操作。
#include <iostream>
#include <vector>
#include <set>
using namespace std;
vector<int> removeDuplicatesWithSet(const vector<int>& arr) {
// 将vector转换为set,自动去重
set<int> uniqueSet(arr.begin(), arr.end());
// 将set转换回vector
vector<int> result(uniqueSet.begin(), uniqueSet.end());
return result;
}
int main() {
vector<int> arr = {
1, 2, 2, 3, 4, 4, 5, 1, 3};
vector<int> uniqueArr = removeDuplicatesWithSet(arr)