Introduction : La question éternelle "Est-ce que ça s'y trouve ?"
Imaginez : vous codez un jeu en C++ et devez vérifier si le joueur possède une clé dans son inventaire. Ou vous travaillez sur un système de journalisation — vous devez vous assurer qu'un message avec cet ID n'a pas déjà été traité. Ou vous faites simplement un devoir de programmation. Et là — stop. Comment, diable, savoir rapidement si un élément se trouve dans un std::vector ?
Cette question est l'une des plus populaires sur Stack Overflow (des dizaines de milliers de vues !). Et pour cause. std::vector est le cheval de bataille du C++, mais il ne possède pas de méthode intégrée .contains(), comme en Python ou C#. Les débutants sont souvent perdus. Les experts perdent du temps à choisir la méthode optimale.
Dans cet article, nous allons passer en revue toutes les méthodes principales pour vérifier la présence d'un élément dans un vecteur : de la plus simple et évidente aux astuces avec la recherche binaire. Vous saurez quelle méthode utiliser quand, et vous ne vous poserez plus jamais la question. C'est parti !
Méthode 1 : Le classique — std::find
La manière la plus directe et compréhensible est d'utiliser l'algorithme std::find du fichier d'en-tête <algorithm>. Il fonctionne pour tout type de données qui supporte l'opérateur de comparaison ==.
La logique est simple : std::find parcourt le vecteur du début à la fin et retourne un itérateur pointant vers le premier élément trouvé. Si l'élément n'est pas trouvé, il retourne vector.end().
Exemple de code :
#include <iostream>#include <vector>#include <algorithm> // pour std::find
int main() { std::vector<int> numbers = {10, 20, 30, 40, 50}; int target = 30;
// On cherche l'élément auto it = std::find(numbers.begin(), numbers.end(), target);
if (it != numbers.end()) { std::cout << "Élément " << target << " trouvé ! (indice : " << std::distance(numbers.begin(), it) << ")" << std::endl; } else { std::cout << "Élément " << target << " NON trouvé." << std::endl; } return 0;}Avantages : Simplicité, clarté, fonctionne avec tout type (int, string, structures personnalisées).
Inconvénients : Complexité linéaire O(n). Si le vecteur est grand (des millions d'éléments) et que vous cherchez souvent, c'est lent.
Méthode 2 : Compter les occurrences — std::count
Parfois, il ne s'agit pas seulement de savoir "présent ou absent", mais de comprendre combien de fois un élément apparaît. Pour cela, std::count est idéal. Il vient aussi de <algorithm>.
Exemple de code :
#include <iostream>#include <vector>#include <algorithm>
int main() { std::vector<std::string> fruits = {"pomme", "banane", "pomme", "orange"}; std::string target = "pomme";
int count = std::count(fruits.begin(), fruits.end(), target);
if (count > 0) { std::cout << "Le fruit '" << target << "' a été trouvé " << count << " fois." << std::endl; } else { std::cout << "Le fruit est absent." << std::endl; } return 0;}Avantages : Donne le nombre de répétitions. Très simple aussi.
Inconvénients : Toujours la complexité linéaire O(n). Si vous avez seulement besoin d'un "oui/non", std::find peut s'arrêter à la première correspondance, alors que std::count parcourt tout le vecteur. Donc pour vérifier l'existence, std::find est légèrement plus rapide.
Méthode 3 : Tri + recherche binaire (pour les experts)
Si vous cherchez des éléments dans le même vecteur plusieurs fois, il est temps de passer au niveau supérieur. Triez le vecteur une fois et utilisez std::binary_search. La complexité est logarithmique O(log n). C'est beaucoup plus rapide sur de grandes données.
Condition importante :
Le vecteur doit être trié