@swt1337

Как сравнить и вывести сколько чисел в двух одномерных массивах равны [C / C++]?

Существуют два массива arr[size] и arr_2[size] /* size = 7 */ Подскажите пожалуйста как с помощью C / C++ сравнить два этих массива и вывести число равных в них чисел. Например: arr{1, 2, 3, 4, 5, 6, 7}, а arr_2{1, 2, 3, 44, 55, 66, 77} И в cout выводит "Чисел равных в этих массивах 3". Помогите, буду очень благодарен
  • Вопрос задан
  • 2682 просмотра
Решения вопроса 2
BacCM
@BacCM
C++ почти с рождения
Самое простое и понятное два цикла вложенных друг в друга. Т.е. Берёшь нулевой элемент первого массива, сравниваешь с каждым элементом второго. Потом первый и т.д
На c++ можно извратиться и записать это в одну конструкцию

Побаловался от нечего делать
inline int count_cpp()
{
    return count_if(begin(a), end(a), [](int c) {static set<int> s(begin(b), end(b)); return  s.find(c) != s.end();});
}


inline int count_c()
{
    int c = 0;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if(a[i] == b[j]) {
                ++ c;
                break;
            }
        }
    }
    return c;
}


inline int count_map()
{
    int c = 0;
    map<int, bool> bm;
    for (auto i : b) {
        bm[i] = true;
    }
    for (auto i : a) {
        if (bm.find(i) != bm.end()) {
            ++ c;
        }
    }
    return c;
}


Время выполнения для 10000 случайных элементов в диапазоне 0-10000

[cpp method]      Time:   4006 us.
[pure c method]   Time:   71019 us.
[map method]     Time:   5178 us.
Ответ написан
Комментировать
myjcom
@myjcom Куратор тега C++
если есть повторы?

массив где есть повторы нужно передавать первым параметром.
#include <algorithm>
#include <iostream>
using namespace std;

template<typename T, int N, int M>
auto count_match(T(&a)[N], T(&b)[M])
{
  size_t match_count = 0;
  sort(begin(b), end(b));
  for(auto& val : a)
  { 
    if(binary_search(begin(b), end(b), val))
    {
      ++match_count;
    }
  }
  return match_count;
}

int main()
{
  int  v[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 22};
  int v2[] = {0, 22, 33, 5, 4, 8, 9, 0, 13};
  
  std::cout << count_match(v, v2);

  cin.get();
}

если числа повторяются в обоих массивах
нужно по другому делать,
например с помощью std::map
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@zuko3d
Хороший метод, работающий за O(n log(n)): https://ru.cppreference.com/w/cpp/algorithm/set_in... (см. пример кода в самом низу)

Главное - не забыть предварительно отсортировать массивы, т.к. сама эта функция только сравнивает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы