在C ++中从阵列删除重复项

时间:2020-10-14 03:45:10

标签: c++

我正在尝试编写一个程序,该程序在不更改值顺序的情况下删除数组中的所有重复值。输出应如下所示:

5 3 7 1 7 7 2 3 5 5
5 3 7 1 2

但是在我的程序中,重复值已被删除的新数组无法打印。

这是我的代码:

#include <iostream>

using namespace std;

int unique(int array[], int n) {

    if (n==0 || n==1)
        return n;
    
    int temp[n];
    
    int j = 0;
    int i = 0;
    
    for(i = 0; i < n -1; i++)
        if (array[i] != array[i+1])
            temp[j++] = array[i];
    
    temp[j++] = array[n-1];
    
    for(i = 0; i < j; i++)
        array[i] = temp[i];
    
    return j;
}

int main() {
    int array[10];
    int n, i;
    for(int i = 0; i < 10; i++)
        cin >> array[i];

    int size = unique(array, n);

    if(size < 0 || size > 10)
        return -1;

    for(int size = 0; i < size; i++) {
        cout << array[i] << " ";
    }
    cout << endl;

    return 0;
}

编辑:在收到有关数组的约束和大小的一些建议之后,我对代码进行了重新设计。我还取消了temp的使用,因为它不是正确的C ++。这是新代码:

#include <iostream>

using namespace std;

int unique(int array[]) {
    int size = 10;
    int i, j, k;

    for(i = 0; i < size; ++i)
        for(j = i + 1; j <size;){
            if(array[i]==array[j]){
                for( k = j; k<size-1;++k)
                    array[k]=array[k+1];
                
                --size;
            }
            else
                ++j;
        }

    return size;
}

int main() {
    int array[10];
    for(int i = 0; i < 10; i++)
        cin >> array[i];

    int size = unique(array);

    if(size < 0 || size > 10)
        return -1;

    for(int i = 0; i < size; i++) {
        cout << array[i] << " ";
    }
    cout << endl;

    return 0;
}

2 个答案:

答案 0 :(得分:1)

首先从数组中删除元素意味着需要调整其大小,因此最好使用向量。

基本思想是这个

  1. 存储您在某些数据结构(称为映射)中看到的值。在C ++中,std :: unordered_map使用哈希表,因此搜索和插入均为O(1)
  2. 逐元素扫描矢量
  3. 在地图中查找元素(如果有的话),将其删除
  4. 否则,添加要映射的元素并继续到下一个元素

C++ implementation

编辑:

正如PaulMckenzie所建议的那样,最好使用std :: unordered_set,在这种情况下是正确的,因为在这种情况下只需要键就不需要值

答案 1 :(得分:1)

您应该使用std::vector而不是数组,或者如果知道编译时元素的数量,请使用std::array。这是一个适用于数组或任何STL容器的解决方案(进行了一些小的语法修改,即使用std::beginstd::end):

int unique(int *arr, int n)
{
  auto end = arr + n;

  for (auto begin = arr; begin != end; ++begin)
    end = std::remove(begin + 1, end, *begin);

  return end - arr;
}