C++数组去重方法详解:从基础到高级实现

掌握数组去重是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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值