Как мне найти пересечение 2 комплектов?

Каков наиболее эффективный способ создания подмножества из 2 наборов, которое содержит значения из обоих? Любая библиотека C++ STL может быть использована для решения этой проблемы (без библиотеки Boost, если это возможно):

Set A = {2, 3, 5, 7, 11, ...}
Set B = {1, 3, 5, 7, 9, 11, ...}

Subset should be = {3, 5, 7, 11, ...}

2 ответа

Решение

Вы можете сделать это с помощью set_intersection Там вы найдете пример, как его использовать:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
    std::vector<int> v1{2, 3, 5, 7, 11};;
    std::vector<int> v2{1, 3, 5, 7, 9, 11};
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::vector<int> v_intersection;

    std::set_intersection(v1.begin(), v1.end(),
                          v2.begin(), v2.end(),
                          std::back_inserter(v_intersection));
    for(int n : v_intersection)
        std::cout << n << ' ';
}

Результаты будут:

 3 5 7 11

Использование std::set_intersection как описано здесь:

http://www.cplusplus.com/reference/algorithm/set_intersection/

Другие вопросы по тегам