Создать новый вектор из других, используя только дубликаты - PullRequest
6 голосов
/ 21 мая 2019

Допустим, у меня есть набор vector<int>:

std::vector<int> a = {2,3,8,4,9,0,6,10,5,7,1};
std::vector<int> b = {6,10,8,2,4,0};
std::vector<int> c = {0,1,2,4,5,8};

Я хочу создать новый вектор таким образом, чтобы в новый вводились только элементы, которые являются общими для всех входных векторов.вектор следующим образом:

std::vector<int> abc = {8,2,0,8}; // possible output, order doesn't matter

Я видел много вопросов, спрашивающих, как удалить дубликаты, но я хочу сохранить только дубликатов.

Существует ли эффективный алгоритм или конструкция STL, которая сделает это для меня, или мне нужно написать свой собственный?

1 Ответ

5 голосов
/ 21 мая 2019

Как уже упоминалось, вы можете использовать алгоритм set_intersection , чтобы сделать это: Но вам также придется сначала отсортировать vector s

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
    std::vector<int> a = {0,1,2,3,4,5,6,7,8,9,10};
    std::vector<int> b = {0,2,4,6,8,10};
    std::vector<int> c = {0,1,2,4,5,8};

    std::vector<int> temp;
    std::vector<int> abc;

    std::sort(a.begin(), a.end());
    std::sort(b.begin(), b.end());
    std::sort(c.begin(), c.end());

    std::set_intersection(a.begin(), a.end(),
                          b.begin(), b.end(),
                          std::back_inserter(temp));

    std::set_intersection(temp.begin(), temp.end(),
                          c.begin(), c.end(),
                          std::back_inserter(abc));

    for(int n : abc)
        std::cout << n << ' ';
}

LIVE DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...