Vérifier si une chaîne est présente comme un élément dans un vecteur
Quel est le moyen le plus efficace pour vérifier si un stl vecteur de chaînes de caractères contient
une chaîne de caractères?
Si la vérification de la présence d'un élément dans votre conteneur est quelque chose que vous prévoyez d'avoir à le faire souvent, vous pouvez envisager d'utiliser un std::set à la place (à condition bien sûr que vous ne voulez pas dupliquer des chaînes dans votre jeu). std::set a une méthode find() pour lesquels la complexité moyenne est garantie log(n).
OriginalL'auteur user620189 | 2011-03-30
Vous devez vous connecter pour publier un commentaire.
L'évident mais peut-être trop lent solution est
std::find(vec.begin(), vec.end(), your_string);
Si votre vecteur ne change pas beaucoup, à les trier d'abord, puis utiliser
binary_search
,lower_bound
,upper_bound
, ouequal_range
. Si votre vecteur change beaucoup de choses, pensez à utiliser unset
/multiset
(ou en cas de besoinmap
/multimap
) à la place.En fonction de vos besoins une table de hachage (
unordered_set
) pourrait être approprié, mais c'est plus différent de votre récipient initial choix que la normale commandé des conteneurs, et n'est pas fourni avant le C++0x (vous pouvez l'obtenir à partir de stimuler facilement).multiset
si la valeur peut exister plus d'une fois.Encore plus rapide peut-être une table de hachage, ou un préfixe de l'arbre (aka trie). Le premier est plus ou moins standard:
unordered_set
dans C++0x (aussi disponible en Boost), ouhash_set
dans la vieille école de la STL. Vous pourriez avoir à écrire votre propre version de ce dernier, ou à la recherche d'une bonne mise en œuvre.OriginalL'auteur Mark B
Utilisation
std::find
de trouver la chaîne cible. C'est une recherche linéaire, alors méfiez-vous de la recherche de grands vecteurs.Pour savoir si le vecteur contient la cible ou non, utilisation:
OriginalL'auteur quamrana
Ici est un C++11 alternative:
N'hésitez pas à ajuster le lambda fonction de ce que vous voulez, par exemple,
Parce que (i) tel que mentionné, il est extensible, (ii) l'obtention d'un bool est de l'omi de plus agréable que de questionner les itérateurs et (iii) il est une alternative à l'autre 4 réponse de tous les états la notion même ... je n'ai pas dit que c'est la plus efficace.
Ok, j'ai juste reconnu que la question explicitement demandé pour plus d'efficacité. Comme dit, je ne sais pas comment il se comporte par rapport à
std::find
, mais encore il pourrait être utile.En fait ce qui m'a aidé, même si elle a été inefficace pour l'OP.
OriginalL'auteur davidhigh
OriginalL'auteur jmccarthy
Utiliser std::find pour rechercher la chaîne.
OriginalL'auteur Mahesh