C++ 从C+中的数组中删除重复项+;

C++ 从C+中的数组中删除重复项+;,c++,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]

我试图编写一个程序,删除数组中的任何重复值,而不改变值的顺序。输出应如下所示:

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;
}

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

基本思想是这样的

  • 存储您在某些数据结构(称为map)中看到的值。在C++ STD中:unOrdEdjPad使用哈希表,因此搜索和插入是O(1)
  • 逐元素扫描矢量
  • 查找映射中的元素(如果存在)删除该元素
  • 否则,添加要映射的元素并继续下一个元素
  • 编辑:


    正如PaulMckenzie所建议的,最好使用std::unordered_set,这在本例中是正确的,因为在本例中不需要值,只需要键。首先从数组中删除元素意味着需要调整其大小,因此最好使用向量

    基本思想是这样的

  • 存储您在某些数据结构(称为map)中看到的值。在C++ STD中:unOrdEdjPad使用哈希表,因此搜索和插入是O(1)
  • 逐元素扫描矢量
  • 查找映射中的元素(如果存在)删除该元素
  • 否则,添加要映射的元素并继续下一个元素
  • 编辑:


    正如PaulMckenzie所建议的,最好使用std::unordered_set,这在本例中是正确的,因为在本例中不需要值,只需要键

    ,您应该使用
    std::vector
    而不是数组,或者如果您知道编译时的元素数,则使用
    std::array
    。下面是一个适用于数组或任何STL容器的解决方案(只需稍作语法修改,即使用
    std::begin
    std::end
    ):


    您应该使用
    std::vector
    而不是数组,或者如果您知道编译时的元素数,那么应该使用
    std::array
    。下面是一个适用于数组或任何STL容器的解决方案(只需稍作语法修改,即使用
    std::begin
    std::end
    ):


    if(array[i]!=array[i+1])
    ——如果数字不相邻,该如何检测重复项?我认为您需要重新思考逻辑,可能需要使用不同的数据结构来“记住”已经看到的值。例如:
    [8 1 2 3 4 5 8]
    --如何检测到
    8
    是重复的?@PaulMcKenzie即使数字紧挨着,它也不会打印任何东西,但你是对的。因为我是初学者,我不知道如何使用<代码> STD::向量TEMP(n)< /C>。使用C++代码:STD::Vector <代码>是C++中动态数组的实现方式。第二件事是您的逻辑是错误的——您从
    unique
    返回的值决定了要打印的数量(
    size
    变量)。为什么不从
    unique
    打印返回值以查看将打印多少?如果为0或更小,不要感到惊讶。因此,您需要首先让
    unique
    的逻辑工作。此外,初学者C++也不会得到这些问题——这听起来像是一个在线编码网站的问题。@ PaulMcKeZie你是正确的,它直接打印出0,当我直接打印什么代码>独特< <代码>返回。<代码>为(int大小=0;i<大小;i++)<代码>。你觉得有什么不对劲吗?另外,它是只有10个数字,还是数组可以是任意大小的?数字的最大数量是多少?
    如果(数组[i]!=数组[i+1])
    ——如果数字不相邻,如何检测重复的数字?我认为您需要重新思考逻辑,可能需要使用不同的数据结构来“记住”已经看到的值。例如:
    [8 1 2 3 4 5 8]
    --如何检测到
    8
    是重复的?@PaulMcKenzie即使数字紧挨着,它也不会打印任何东西,但你是对的。因为我是初学者,我不知道如何使用<代码> STD::向量TEMP(n)< /C>。使用C++代码:STD::Vector <代码>是C++中动态数组的实现方式。第二件事是您的逻辑是错误的——您从
    unique
    返回的值决定了要打印的数量(
    size
    变量)。为什么不从
    unique
    打印返回值以查看将打印多少?如果为0或更小,不要感到惊讶。因此,您需要首先让
    unique
    的逻辑工作。此外,初学者C++也不会得到这些问题——这听起来像是一个在线编码网站的问题。@ PaulMcKeZie你是正确的,它直接打印出0,当我直接打印什么代码>独特< <代码>返回。<代码>为(int大小=0;i<大小;i++)<代码>。你觉得有什么不对劲吗?另外,它是只有10个数字,还是数组可以是任意大小的?数字的最大数量是多少?最好使用
    std::unordered_set
    @PaulMcKenzie你说得对,我刚刚编辑了这篇文章。@PaulMcKenzie但是
    unordered_set
    也不会维护元素的原始顺序。该集合不会用于维护顺序。它将被简单地用作确定已经看到了什么的一种方法。最好使用
    std::unordered_set
    @PaulMcKenzie你说得对,我刚刚编辑了这篇文章。@PaulMcKenzie但是
    unordered_set
    也不会维护元素的原始顺序。该集合不会用于维护顺序。它将被简单地用作确定已经看到了什么的一种方法。
    #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;
    }
    
    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;
    }