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">
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 << ' ';
}
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.
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
.