Introdução: A eterna pergunta "Isso está aqui?"
Imagine: você está programando um jogo em C++ onde precisa verificar se o jogador tem uma chave no inventário. Ou está trabalhando em um sistema de log — precisa garantir que uma mensagem com esse ID ainda não foi processada. Ou simplesmente está fazendo um dever de casa de programação. E então — pára. Como, diabos, saber rapidamente se um elemento está em std::vector?
Esta pergunta é uma das mais populares no Stack Overflow (dezenas de milhares de visualizações!). E não é à toa. std::vector é o cavalo de batalha do C++, mas não possui um método embutido .contains() como em Python ou C#. Iniciantes frequentemente se perdem. Profissionais — perdem tempo escolhendo a maneira ideal.
Neste artigo, abordaremos todas as principais maneiras de verificar a presença de um elemento em um vetor: desde a mais simples e óbvia até truques inteligentes com busca binária. Você aprenderá qual método usar quando e nunca mais ficará na dúvida. Vamos lá!
Método 1: O clássico — std::find
O caminho mais direto e compreensível é usar o algoritmo std::find do arquivo de cabeçalho <algorithm>. Ele funciona para qualquer tipo de dado que suporte o operador de comparação ==.
A lógica é simples: std::find percorre o vetor do início ao fim e retorna um iterador para o primeiro elemento encontrado. Se o elemento não for encontrado, ele retorna vector.end().
Exemplo de código:
#include <iostream>#include <vector>#include <algorithm> // para std::find
int main() { std::vector<int> numbers = {10, 20, 30, 40, 50}; int target = 30;
// Procurando o elemento auto it = std::find(numbers.begin(), numbers.end(), target);
if (it != numbers.end()) { std::cout << "Elemento " << target << " encontrado! (índice: " << std::distance(numbers.begin(), it) << ")" << std::endl; } else { std::cout << "Elemento " << target << " NÃO encontrado." << std::endl; } return 0;}Vantagens: Simplicidade, clareza, funciona com qualquer tipo (int, string, structs próprias).
Desvantagens: Complexidade linear O(n). Se o vetor for grande (milhões de elementos) e você pesquisar com frequência — é lento.
Método 2: Contando ocorrências — std::count
Às vezes, você precisa não apenas saber "sim ou não", mas entender quantas vezes um elemento aparece. Para isso, std::count é ideal. Ele também vem de <algorithm>.
Exemplo de código:
#include <iostream>#include <vector>#include <algorithm>
int main() { std::vector<std::string> fruits = {"apple", "banana", "apple", "orange"}; std::string target = "apple";
int count = std::count(fruits.begin(), fruits.end(), target);
if (count > 0) { std::cout << "Fruta '" << target << "' encontrada " << count << " vez(es)." << std::endl; } else { std::cout << "Fruta ausente." << std::endl; } return 0;}Vantagens: Fornece o número de repetições. Também muito simples.
Desvantagens: Ainda a complexidade linear O(n). Se você precisa apenas de "sim/não", std::find pode parar na primeira correspondência, enquanto std::count percorre todo o vetor. Portanto, para verificar existência, std::find é um pouco mais rápido.
Método 3: Ordenação + busca binária (para profissionais)
Se você pesquisa elementos no mesmo vetor muitas vezes, é hora de subir de nível. Ordene o vetor uma vez e use std::binary_search. A complexidade é logarítmica O(log n). Isso é muito mais rápido em grandes conjuntos de dados.
Condição importante:
O vetor deve estar ordenado<