21xrx.com
2024-09-20 00:27:45 Friday
登录
文章检索 我的文章 写文章
C++数组去重的5种方法
2023-06-23 18:47:09 深夜i     --     --
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函数等。希望本文能够对读者有所帮助,谢谢阅读!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复