从数字数组中删除重复项

时间:2019-08-03 19:28:56

标签: c++

我正在尝试用C ++编写程序,在其中我向a[]中输入一系列数字,然后将这些数字输出到b[]中,以删除所有重复项。例如a[] = {1,3,7,6,3,7}将输出b[] = {1,3,7,6}。谢谢!

int main() {
  int a[10];

  int i, n, j;

  cout << "n=";

  cin >> n;

  for (i = 0; i <= n - 1; i++) {
    cout << "a[" << i << "]=";

    cin >> a[i];
  }

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

  {
    for (j = i + 1; j < n; j++)

    {
      if (a[i] == a[j]) {
        cout << "b= " << a[i] << endl;
      }
    }
  }
  for (i = 0; i <= n; i++) {
    if (a[i] != a[j]) {
      cout << "b=" << a[i] << endl;
    }
  }
}

4 个答案:

答案 0 :(得分:3)

如果您希望删除重复项(并保留顺序),则C ++惯用的方式是使用std :: set和std :: vector(此处仅显示示例的相关片段):

int a[] = {1,3,7,6,3,7};
std::set<int> c;
std::vector<int> b;

for(auto v: a)
 if(c.insert(v).second)
  b.push_back(v);

for(auto v: b)
 std::cout << v << std::endl; 

输出:

1
3
7
6

答案 1 :(得分:1)

您的代码应更改为此(两个代码段都将不遵循数组的顺序):

  for (i = 0; i < n; i++) {
    bool notDup = true;
    for (j = i + 1; j < n; j++) {
      if (a[i] == a[j]) {
          notDup = false;
          break;
      }
    }
    if(notDup)
        cout << "b= " << a[i] << endl;
  }

但是,解决问题的更简单方法是构造一个std::set,它将省略重复项。

vector<int> a{1,3,7,6,3,7};
set<int> b(a.begin(), a.end());
for (auto& elem : b)
{
    std::cout<<elem<<'\n';
}

Live

答案 2 :(得分:1)

使用std::unordered_set跟踪已保留的元素。另外,请使用std::vector而不是C样式的数组。

vector<int> a{1, 3, 7, 6, 3, 7}, 
            b;
unordered_set<int> s;
for(auto i : a)
{
    if (s.insert(i).second)
    {
        b.push_back(i);
    }
}

答案 3 :(得分:0)

有很多方法可以从向量中删除重复项。

Oblivion解决方案中,简单的方法是将它们插入到集合中,然后从集合中获取价值。

vector<int> a{1,3,7,6,3,7};
set<int> b(a.begin(), a.end());
for (auto& elem : b)
{
    std::cout<<elem<<'\n';
}

另一种方法是在STL中使用 unique 。如果您不想使用更多的内存,那么此解决方案非常理想。时间复杂度为O(nlogn)

vector<int> a{1,3,7,6,3,7};
sort(a.begin(), a.end()); 
a.erase(unique(a.begin(), a.end()), a.end());
相关问题