c ++ удаление идентичного элемента из двух массивов, которые не содержат самого числа в - PullRequest
0 голосов
/ 12 апреля 2020

Постановка задачи: есть два массива. Некоторые элементы являются общими для этих массивов. Как и arr1 = {5,2,6}; и arr2 = {7,9,5,2,3}. Следовательно, 5,2 являются общими элементами, потому что они существуют в обоих массивах. Что касается вопроса, мне нужно исключить общие элементы из массивов. Таким образом, полученные массивы содержат arr1 = {5} и arr2 = {7,9,3}.

Мой подход заключается в том, чтобы сначала объединить оба массива в третий массив, а затем устранить дублирующиеся элементы с помощью операции set. Но при таком подходе элемент, который появляется во второй раз, удаляется, но сам элемент в списке. Кроме того, я получаю один список вместо двух отдельных списков.

Мой код:

#include <iostream>
#include <string>
#include<unordered_set>

int main()
{
    std::unordered_set<int> remove_duplicate;
    int arr[3]={5,2,6};
    int arr1[5]={7,9,5,2,3};
    int m= sizeof(arr)/sizeof(arr[0]);
    int n= sizeof(arr1)/sizeof(arr1[0]);
    int mergearr[m+n];
    std::copy(arr,arr+m,mergearr);
    std::copy(arr1,arr1+n,mergearr+m);
  for(int i=0;i<(m+n);i++){
  std::cout<<mergearr[i]<< ' ';
  }
  std::cout<< '\n';


 for(int j=0;j<(m+n);j++){
  remove_duplicate.insert(mergearr[j]);
 }
 for(auto it=remove_duplicate.begin();it!=remove_duplicate.end();++it){

  std::cout<<' '<<*it;
  }
  return 0;
}

Вывод:

5 2 6 7 9 5 2 3 
  3 9 7 6 2 5 

Как я могу решить эту проблему? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Во-первых, массивы имеют фиксированный размер, поэтому удаление элемента из массива невозможно, если только вы не определите, что подразумевается под «стиранием из массива». Таким образом, более подходящим контейнером для использования является std::vector<int>.

Учитывая, что, если вам разрешено сортировать обе последовательности, вы можете использовать std :: set_intersection , чтобы сначала найти общие элементы. Затем используйте std::remove_if для обоих векторов, используя сгенерированный набор общих элементов.

Вот пример:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <unordered_set>

int main()
{
    std::vector<int> arr = {5,2,6};
    std::vector<int> arr1 = {7,9,5,2,3};

    // First, sort both containers
    std::sort(arr.begin(), arr.end());
    std::sort(arr1.begin(), arr1.end());

    // Next, call std::set_intersection to collect the common elements into 
    // the unordered_set
    std::unordered_set<int> common;
    std::set_intersection(arr.begin(), arr.end(), arr1.begin(), arr1.end(), 
                          std::inserter(common, common.begin()));

    // Now erase the items in each vector that matches the items in the set
    arr.erase(std::remove_if(arr.begin(), arr.end(), 
                             [&](int n) { return common.count(n); }), arr.end());
    arr1.erase(std::remove_if(arr1.begin(), arr1.end(), 
                             [&](int n) { return common.count(n); }), arr1.end());

    // Output results
    for (auto i : arr)
       std::cout << i << " ";
    std::cout << "\n";
    for (auto i : arr1)
       std::cout << i << " ";
}

Выход:

6 
3 7 9 
0 голосов
/ 12 апреля 2020

Как сказано в комментарии PaulMcKenz ie, вы хотите удалить все элементы в пересечении наборов списков. Либо используйте std :: set_intersection, либо просматривайте элементы во втором массиве и проверяйте, находятся ли они в первом (используя набор).

...