2009-12-10 1 views
0

Étant donné deux vecteurs d'entiers, comment déterminer s'il y a un élément du 1er vecteur est présent dans le 2ème?Trouver l'élément vectoriel dans le second vecteur

+0

Sont-ils triés, peuvent-ils être classés en place ou doivent-ils rester dans leur courant commande? –

+0

Est-ce que ce sont les devoirs? Si c'est le cas, il devrait être étiqueté comme tel. – Andres

+0

avez-vous des contraintes de complexité? – philsquared

Répondre

9

Je suppose que quelque chose comme cela devrait fonctionner:

std::vector<int> v1,v2; 
if(std::find_first_of(v2.begin(),v2.end(),v1.begin(),v1.end()) != v2.end()) 
    std::cout << "found!\n"; 
+0

c'est exactement ce que je recherche – dimba

+1

Bien que cela puisse paraître pire en complexité 'O (v1.size() * v2.size())', cela n'a pas vraiment d'importance sur les petits ensembles, et vous ne le faites pas avoir à modifier (trier) vos vecteurs au préalable. –

4

Vous pouvez prendre la set_intersection des deux vecteurs, puis vérifier si l'intersection résultante est vide:

std::sort(v1.begin(), v1.end()); 
std::sort(v2.begin(), v2.end()); 
std::set_intersection(v1.begin() 
    , v1.end() 
    , v2.begin() 
    , v2.end() 
    , std::back_inserter(v3)); 
bool containsElements = !v3.empty(); 

set_intersection se trouvent dans #include <algorithm>

Pour set_intersection à travailler, les deux vecteurs doivent d'abord être trié.

+3

Il est à noter que v1 et v2 doivent être triés pour que cela fonctionne. –

+2

Il convient de noter que vous devriez préférer 'v3.empty()' à 'v3.size() == 0'. –

+0

@Charles Bailey et @Matthie M.: J'ai ajouté les deux, merci. –

0

Je pense que quelque chose comme ceci:

bool contains(const std::vector<int>& vec, int val){ 
    for(std::vector<int>::const_iterator it=vec.begin(); it!=vec.end(); ++it){ 
     if(*it==val){ 
      return true; 
     } 
    } 
    return false; 
} 

bool contains(const std::vector<int>& from, const std::vector<int>& in){ 
    for(std::vector<int>::const_iterator it=from.begin(); it!=from.end(); ++it){ 
     if(contains(in, *it)){ 
      return true; 
     } 
    } 
    return false; 
} 

// Example 
std::vector<int> a; 
std::vector<int> b; 

a.push_back(2); 
a.push_back(1); 
b.push_back(0); 
b.push_back(1); 

bool contains = contains(a, b); 
+0

c'est égal à manuscrit pour pour. Je suis à la recherche d'une solution de façon STL – dimba

+0

J'ai lu votre commentaire pour avis après l'avoir posté: P – VDVLeon