使用set方法从未排序的数组中删除重复项

时间:2019-07-27 20:31:29

标签: c++

因此问题表明我必须输入包含重复项的未排序元素数组,因此决定使用sort。我对此并不陌生,

我正在尝试在GFG的IDE上运行它。

#include <iostream>
#include <bits/stdc++.h>

int main() {
    //code
    int n,size,a;
    cin>>n;
    while(n--)
    {
        cin>>size;
        int a[size];
        set<int> s;
        for(int i=0;i<size;i++)
          {
              cin>>a;
              s.insert(a);
          }
          for(int i=s.begin();i!=s.end();i++)
            cout<<i<<" ";
    return 0;
}

错误消息:

no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream<char>}' and 'int [size]')
            cin>>a;

2 个答案:

答案 0 :(得分:1)

您显示的错误的来源是此行:

int main() {
   //...
       int a[size]; 
   // ...
}

a现在是一个数组,在operator>>()中没有std::istream的重载。

解决方案很简单,只需更改此行:

cin>>a;

对此:

cin>>a[i];

现在,应该不存在编译问题,尽管仍然存在大量不良做法,其中一些答案和其他注释以及答案已尝试纠正。我会留给他们。

我唯一要警告您的是

int a;
some block {
   int a[size];
}
// try to use a:
a[i]; // bad

程序中有2个名为a的变量。一旦秒a超出范围,它将破坏a的数组版本,而改用常规int a。只是要对此保持警惕。

P.S。好吧,所以我要提到另一个别人没有提到的。

以下is ill formed,因为它尝试使用可变长度数组:

cin>>size;
int a[size];

某些编译器将支持它,但从技术上讲,这是一个格式错误的程序。一般来说,不要这样做。

答案 1 :(得分:0)

我重写了您的代码以向您显示您犯的一些错误:

#include <iostream>
#include <set>

int main() {
    using namespace std;
    int size;
    cin >> size;
    set<int> s;
    for(int i=0;i<size;i++)
    {
          int a;
          cin>>a;
          s.insert(a);
    }

    for(auto i : s)
        cout<<i<<" ";

    return 0;
}

a必须是单个元素,cin才能使用它。其次,begin()end()iterator上给您set。为了简化生活,您可以使用循环https://en.cppreference.com/w/cpp/language/range-for

一些最后的评论:

  1. 不包括<bits/stdc++.h>,而是适当的标准标题,以确保您的代码可移植。
  2. 正如评论using namespace std所述,
  3. 不是一个好习惯,我这样做是为了最大程度地减少代码段和您的代码之间的更改。
  4. 鉴于您在评论中指出您不太了解begin()set中的工作方式,请查看以下内容:https://en.cppreference.com/w/cpp/container/set
  5. 正如@Chipster所指出的,您也有一个重复的名称重复项,我也清理了这个问题,避免了名称重复。