Middle
Qual é a complexidade de trabalhar com os contêineres map e unordered_map em C++?
sobes.tech IA
Resposta da IA
std::map (Árvore vermelho-preto)
- Inserção, remoção, busca: O(log N) em média e no pior caso. N é a quantidade de elementos.
- Acesso por chave usando
operator[]ou métodoat(): O(log N). - Obter iterador para o início/fim: O(1).
- Iterar sobre todos os elementos: O(N).
- Memória: O(N).
std::unordered_map (Tabela de dispersão)
- Inserção, remoção, busca: O(1) em média. O(N) no pior caso (quando há colisões fortes na hash). N é a quantidade de elementos.
- Acesso por chave usando
operator[]ou métodoat(): O(1) em média. O(N) no pior caso. - Obter iterador para o início/fim: O(1).
- Iterar sobre todos os elementos: O(N) em média. A ordem de iteração não é garantida.
- Memória: O(N). Depende do fator de carga e da implementação da tabela de dispersão.
Comparação:
| Operação | std::map (O) |
std::unordered_map (O) |
|---|---|---|
| Inserção, Remoção | log N | 1 (média), N (pior) |
| Busca | log N | 1 (média), N (pior) |
| Acesso por chave | log N | 1 (média), N (pior) |
| Iteração sobre todos | N | N (média) |
std::unordered_map geralmente é mais rápido para operações individuais (inserção, busca, remoção) devido a O(1) em média, mas requer uma boa função hash e é sensível a colisões. std::map garante complexidade logarítmica independentemente dos dados, mantém os elementos ordenados e não requer uma função hash para o tipo de chave.