Dans Ruby je peux faire:fonction intégrée pour tester si 4 est en [1,2,3,4] (vecteur)
[1,2,3,4].include?(4) #=>True
En Haskell je peux faire:
4 `elem` [1,2,3,4] #=> True
Que dois-je faire en C++?
Dans Ruby je peux faire:fonction intégrée pour tester si 4 est en [1,2,3,4] (vecteur)
[1,2,3,4].include?(4) #=>True
En Haskell je peux faire:
4 `elem` [1,2,3,4] #=> True
Que dois-je faire en C++?
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)) {...}
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;
}
std :: find être précis :) –
Maintenant, il doit être complet :) – Burkhard
@forcey, Pas besoin de se qualifier complètement 'find' selon Koenig recherche (standard C++ 3.4.2). –
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
}
Nécessite l'itération dans toute la structure de données. –
Oui, mais il a la même complexité que find has = O (n). –
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. –
Vous pouvez utiliser mis std :: Ceci a une méthode find().
Chaque conteneur a une méthode 'find'. C'est juste habituellement un non membre. – jalf
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
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
Si le vecteur est commandé, vous pouvez également utiliser std :: binary_search.
std::binary_search(vec.begin(), vec.end(), 4) // Returns true or false
Ce code est-il supposé compiler? – GRB
En théorie. Je ne l'ai pas testé. ;) Quels problèmes voyez-vous? – jalf
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