21xrx.com
2025-03-25 13:34:07 Tuesday
文章检索 我的文章 写文章
C++数组去重的5种方法
2023-06-23 18:47:09 深夜i     15     0
C++ 数组 去重 方法 算法

在使用C++进行编程时,经常需要处理数组去重的任务。为此,我们提供5种不同的方法,可以在不同的场合下使用。

1. 使用set容器

使用set容器是最常见也是最简单的数组去重方法。由于set容器可以自动去重,因此我们只需要将数组的每个元素插入到set容器中,再将set容器中的元素插入到新数组中即可完成去重操作。具体代码如下:

#include <iostream>
#include <set>
using namespace std;
int main() {
  int arr[] = 3;
  int n = sizeof(arr) / sizeof(arr[0]);
  set<int> s;
  for (int i = 0; i < n; i++) {
    s.insert(arr[i]);
  }
  int new_arr[s.size()], idx = 0;
  for (auto it = s.begin(); it != s.end(); ++it) {
    new_arr[idx++] = *it;
  }
  for (int i = 0; i < s.size(); i++) {
    cout << new_arr[i] << " ";
  }
  return 0;
}

输出:

1 2 3 4 5

2. 使用unique和erase函数

使用unique和erase函数也是一种很好的方法。它的流程是先将数组排序,再调用unique函数去重,最后再调用erase函数删除重复的元素,具体代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
  int arr[] = 1;
  int n = sizeof(arr) / sizeof(arr[0]);
  sort(arr, arr + n);
  int* new_arr = unique(arr, arr + n);
  for (int* i = arr; i != new_arr; i++) {
    cout << *i << " ";
  }
  return 0;
}

输出:

1 2 3 4 5

3. 使用hash表

使用hash表也可以实现数组去重。首先我们需要定义一个hash表,然后遍历数组中的元素,将元素作为键插入到hash表中。如果插入成功,就将该元素加入到新数组中,否则说明该元素重复,不做处理即可。具体代码如下:

#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
  int arr[] = 1;
  int n = sizeof(arr) / sizeof(arr[0]);
  unordered_map<int, bool> hash_map;
  int new_arr[n], idx = 0;
  for (int i = 0; i < n; i++) {
    if (hash_map.find(arr[i]) == hash_map.end()) {
      hash_map.insert(make_pair(arr[i], true));
      new_arr[idx++] = arr[i];
    }
  }
  for (int i = 0; i < idx; i++) {
    cout << new_arr[i] << " ";
  }
  return 0;
}

输出:

1 2 3 4 5

4. 使用位图

如果数组的元素范围较小,可以使用位图的方式去重。我们可以用一个全局的bool类型数组来记录每个元素是否出现过。遍历数组中的元素,将该元素对应的数组元素设置为true,如果已经为true,说明该元素重复,不做处理即可。具体代码如下:

#include <iostream>
using namespace std;
const int MAX_N = 10;
bool flag[MAX_N + 1] = { false };
int main() {
  int arr[] = 3;
  int n = sizeof(arr) / sizeof(arr[0]);
  int new_arr[n], idx = 0;
  for (int i = 0; i < n; i++) {
    if (!flag[arr[i]]) {
      flag[arr[i]] = true;
      new_arr[idx++] = arr[i];
    }
  }
  for (int i = 0; i < idx; i++) {
    cout << new_arr[i] << " ";
  }
  return 0;
}

输出:

1 2 3 4 5

5. 使用vector容器

使用vector容器也可以实现数组去重。我们首先将数组中的元素插入到vector容器中,然后调用unique函数去重,最后调用erase函数删除重复的元素即可。具体代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
  int arr[] = 2;
  int n = sizeof(arr) / sizeof(arr[0]);
  vector<int> v(n);
  copy(&arr[0], &arr[n], v.begin());
  v.erase(unique(v.begin(), v.end()), v.end());
  for (int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
  }
  return 0;
}

输出:

1 2 3 4 5

总结

我们提供了5种不同的方法来实现C++数组去重,具体使用哪种方法取决于实际需求和场景。对于较小的数组,我们可以使用简单的位图或vector容器;对于较大的数组,我们可以使用set容器、hash表或unique函数等。希望本文能够对读者有所帮助,谢谢阅读!

  
  

评论区