web-dev-qa-db-fra.com

Intersection vectorielle en C ++

J'ai cette fonction

vector<string> instersection(const vector<string> &v1, const vector<string> &v2);

J'ai deux vecteurs de chaînes et je veux trouver les chaînes qui sont présentes dans les deux, qui remplissent ensuite un troisième vecteur avec les elemnts communs.

Si mes vecteurs sont ...

v1 = <"a","b","c">
v2 = <"b","c">
20
Tyler

Essayez std::set_intersection , par exemple:

#include <algorithm> //std::sort
#include <iostream> //std::cout
#include <string> //std::string
#include <vector> //std::vector

std::vector<std::string> intersection(std::vector<std::string> &v1,
                                      std::vector<std::string> &v2){
    std::vector<std::string> v3;

    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::set_intersection(v1.begin(),v1.end(),
                          v2.begin(),v2.end(),
                          back_inserter(v3));
    return v3;
}

int main(){
    std::vector<std::string> v1 {"a","b","c"};
    std::vector<std::string> v2 {"b","c"};

    auto v3 = intersection(v1, v2);

    for(std::string n : v3)
        std::cout << n << ' ';
}
41
deepmax

Vous devez trier uniquement le plus petit vecteur. Faites ensuite un seul passage sur le vecteur le plus grand et testez la présence de ses éléments dans un vecteur plus petit en utilisant une recherche binaire.

3
Mikhail Volskiy

Au lieu de trier, envisagez d'échanger de la mémoire pour le temps en créant un hachage à partir du vecteur plus petit, puis en bouclant sur le vecteur plus grand en vérifiant ces éléments, comme suggéré ici . Ce serait plus rapide que de trier et d'utiliser std::set_intersection.

0
Eric Auld