2009-08-23 7 views

Répondre

8

Il n'y a pas de fonction intégrée qui fait exactement cela. Il ya std::find qui se rapproche, mais comme il ne renvoie pas de bool, il est un peu plus difficile à utiliser.

Vous pouvez toujours rouler votre propre, pour obtenir une syntaxe similaire à la suggestion de JIa3ep, mais sans utiliser count (qui traverse toujours la séquence entière):

template <typename iter_t> 
bool contains(iter_t first, iter_t last, typename iter_t::value_type val){ 
    return find(first, last, val) != last; 
} 

Ensuite, vous pouvez simplement le faire pour l'utiliser:

std::vector<int> x; 

if (contains(x.begin(), x.end(), 4)) {...} 
+0

Ce code est-il supposé compiler? – GRB

+0

En théorie. Je ne l'ai pas testé. ;) Quels problèmes voyez-vous? – jalf

+0

Eh bien, les deux problèmes d'erreur de compilation que je vois sont que vous combinez le constructeur et la surcharge 'operator()' dans un appel (besoin de faire 'contains (x.begin(), x.end()) (4)') mais en plus de cela puisque 'contains' est un foncteur il ne profite pas de l'inférence de type template (donc en supposant que vous cherchez un' vector 'vous devriez appeler' contains' avec 'contient :: itérateur > (...) (...) '). Enfin comme une erreur logique, vous voulez probablement 'find (first, last, val)', pas 'find (first, first, val)'. – GRB

20

Voici un exemple en utilisant find:

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
     std::vector<int> Num(4); 
     //insert values 
     Num[0]=1; 
     Num[1]=2; 
     Num[2]=3; 
     Num[3]=4; 
     std::vector<int>::iterator p = find(Num.begin(), Num.end(), 4); 
     if (p == Num.end()) 
      std::cout << "Could not find 4 in the vector" << std::endl; 
     else 
      std::cout << "Have found 4 in the vector" << std::endl; 
     return 0; 
} 
+2

std :: find être précis :) –

+0

Maintenant, il doit être complet :) – Burkhard

+1

@forcey, Pas besoin de se qualifier complètement 'find' selon Koenig recherche (standard C++ 3.4.2). –

1

Pour obtenir la syntaxe similaire à la question de l'OP:

std::vector<int> x; 

if (count(x.begin(), x.end(), VAL_TO_FIND)) { 
// found 
} else { 
// not found 
} 
+2

Nécessite l'itération dans toute la structure de données. –

+1

Oui, mais il a la même complexité que find has = O (n). –

+3

Il n'y a pas de raison de parcourir une structure de données de 100 000 objets lorsque celui que je veux savoir est à l'intérieur de la structure de données est à l'index un. Le meilleur temps d'exécution de std :: find est celui de std: count pour voir si un objet existe dans une structure de données. Dans tous les cas, trouver est meilleur ou aussi bon que compte. Ce n'est pas une raison pour l'utiliser. –

0

Vous pouvez utiliser mis std :: Ceci a une méthode find().

+0

Chaque conteneur a une méthode 'find'. C'est juste habituellement un non membre. – jalf

+2

Il existe un algorithme de recherche qui peut être utilisé avec n'importe quel conteneur, mais la classe std :: set est conçue pour être efficace pour les opérations d'ensemble typiques. Par exemple le std :: find() générique prend O (n) pour trouver une valeur, alors que std :: set :: find() prendra O (ln (n)) pour trouver une valeur. – teambob

+0

La philosophie de la STL peut être résumée comme suit: Si c'est un membre, c'est parce que la classe était destinée à le faire. Si c'est un non-membre, c'est parce que c'est possible. Voir par exemple itérateurs aléatoires ('operator +') et autres itérateurs ('std :: advance') – MSalters

2

Si le vecteur est commandé, vous pouvez également utiliser std :: binary_search.

std::binary_search(vec.begin(), vec.end(), 4) // Returns true or false 
Questions connexes