21xrx.com
2024-12-22 19:27:35 Sunday
登录
文章检索 我的文章 写文章
如何在C++中删除数组中的重复元素并保持原来的顺序?
2023-07-14 07:34:09 深夜i     --     --
C++ 删除 数组 重复元素 顺序

在C++中,删除数组中的重复元素并保持原来的顺序是一项常见的任务,尤其是在处理大量数据时。以下提供了一些在C++中删除数组中重复元素的方法。

1.使用std :: unique()函数

std :: unique()是C++ STL中一个非常有用的函数,它可以根据提供的比较函数从数组中删除重复的元素。通过调用该函数,可以在不改变数组中元素顺序的情况下删除重复元素。

下面是一个基于std :: unique()函数的示例:


#include <algorithm> //用于unique()函数

#include <iostream>

#include <iterator> //用于ostream_iterator

using namespace std;

int main()

{

  int arr[] = 3;

  int n = sizeof(arr) / sizeof(arr[0]);

  // 使用std::unique函数从数组中移除重复元素

  // 该函数返回的是非重复元素的区间的末尾迭代器地址

  int* end = std::unique(arr, arr + n);

  

  // 输出非重复元素

  copy(arr, end, ostream_iterator<int>(cout, " "));

  

  return 0;

}

解释:上面代码中,std::unique()函数需要两个指针或迭代器做参数,第一个参数指向数组的开始位置,第二个参数指向数组的结束位置。函数返回值为指向非重复数组元素的指针或迭代器,我们可以使用这个指针或迭代器来输出非重复元素。

2.使用std :: map

可以使用std :: map构建一个有序的非重复元素序列,并将原始数组中的元素插入到此序列中。该方法需要O(nlogn)的时间复杂度,因为std :: map是基于红黑树的。

以下是一个基于std :: map的示例:


#include <iostream>

#include <map> // 使用map容器

using namespace std;

int main()

{

  int arr[] = 5;

  int n = sizeof(arr) / sizeof(arr[0]);

  

  map<int, bool> s;

  for (int i = 0; i < n; i++) {

    if (s.find(arr[i]) == s.end()) { // 如果元素未出现在序列中

      s[arr[i]] = true; // 在序列中插入该元素

      cout << arr[i] << " "; // 输出该元素

    }

  }

  

  return 0;

}

解释:上面的代码中,std :: map维护一个从int到bool的映射,其中key表示整数元素,而value表示此元素是否出现过。我们使用std::map::find()函数来检查元素是否已经存在于序列中,如果该元素不存在,则将其插入到序列中并打印出来。

总结

以上方法都可以在不影响原始数组元素顺序的情况下从数组中删除重复项。使用std :: unique()函数的方法比较简单并且效率更高,但如果你需要维护元素的顺序,则使用std :: map容器可能更为适合。

  
  

评论区

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