unordered_set
Elementos únicos baseados em hash
unordered_set é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
O que é unordered_set
std::unordered_set armazena elementos únicos em uma tabela de dispersão. Em média, os testes de presença levam tempo constante, mas não há ordem definida.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3, 2, 1};
std::cout << s.size() << " unique values\n";
return 0;
}set versus unordered_set
Assim como nos maps:
set: ordenado, O(log n).unordered_set: não ordenado, O(1) em média.
Escolha unordered_set para obter as verificações de presença mais rápidas.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> seen{"a", "b", "c"};
std::cout << (seen.count("b") ? "yes" : "no") << '\n';
return 0;
}Inserir valores
insert() adiciona um elemento, ignorando-o se ele já estiver presente, e retorna um par cujo .second informa se ele foi adicionado.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s;
auto a = s.insert(5);
auto b = s.insert(5);
std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
return 0;
}Testes rápidos de presença
Verificar se você já viu um valor é o caso de uso clássico. count() retorna 0 ou 1.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> blocked{"spam", "junk"};
std::cout << blocked.count("spam") << '\n';
std::cout << blocked.count("ok") << '\n';
return 0;
}Remover elementos
erase() remove um valor e retorna quantos foram removidos (0 ou 1).
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3};
s.erase(2);
std::cout << "count 2: " << s.count(2) << '\n';
std::cout << "size: " << s.size() << '\n';
return 0;
}Detectar duplicatas
Você pode detectar a primeira duplicata em um fluxo inserindo o valor e verificando o resultado booleano.
#include <iostream>
#include <unordered_set>
int main() {
int data[] = {3, 7, 1, 7, 9};
std::unordered_set<int> seen;
for (int x : data) {
if (!seen.insert(x).second) {
std::cout << "first duplicate: " << x << '\n';
break;
}
}
return 0;
}Percorrer
A iteração funciona, mas a ordem é não especificada. Some ou processe os elementos sem presumir nenhuma sequência.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{10, 20, 30};
int total = 0;
for (int x : s) total += x;
std::cout << "sum = " << total << '\n';
return 0;
}Remover duplicatas de um intervalo
Construa um unordered_set a partir de um intervalo para remover duplicatas rapidamente (a ordem não é preservada).
#include <iostream>
#include <unordered_set>
#include <vector>
int main() {
std::vector<int> v{1, 2, 2, 3, 3, 3};
std::unordered_set<int> u(v.begin(), v.end());
std::cout << u.size() << " unique\n";
return 0;
}find versus count
find() fornece um iterador para o elemento, permitindo que você o use posteriormente, enquanto count() apenas informa se ele está presente.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> s{"alpha", "beta"};
auto it = s.find("beta");
std::cout << (it != s.end() ? *it : "none") << '\n';
return 0;
}Limpar e verificar se está vazio
clear() remove todos os elementos, e empty() verifica se não há nenhum.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3};
s.clear();
std::cout << std::boolalpha << s.empty() << '\n';
return 0;
}Interseção de conjuntos
Para encontrar elementos comuns, percorra um conjunto e verifique a presença no outro.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> a{1, 2, 3, 4};
std::unordered_set<int> b{3, 4, 5};
for (int x : a) if (b.count(x)) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Verificação rápida
Teste sua compreensão sobre unordered_set.
Recapitulação
Você aprendeu que std::unordered_set:
- armazena elementos únicos com operações O(1) em média
- não tem ordem garantida
- é ideal para testes rápidos de presença e detecção de duplicatas
A seguir, você aprenderá a criar funções de dispersão para seus próprios tipos personalizados.
Perguntas Frequentes
A aula “unordered_set” é grátis?
Sim — o texto completo de “unordered_set” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “unordered_set”?
Elementos únicos baseados em hash Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “unordered_set”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.