Use o contêiner de mapa STL não ordenado em C++
-
Use o elemento
std::unordered_map
para declarar um contêiner de mapa não ordenado em C++ -
Use a função de membro
contains
para verificar se o elemento dado existe em um mapa em C++ -
Use a função de membro
erase
para remover o elemento específico de um mapa em C++ -
Use a função de membro
insert
para adicionar novos elementos a um mapa em C++
Este artigo explica vários métodos de como usar o contêiner STL unordered_map
em C++.
Use o elemento std::unordered_map
para declarar um contêiner de mapa não ordenado em C++
O elemento std::unordered_map
implementa um contêiner associativo de pares chave-valor onde cada chave é única. Em contraste com o std::map
, o contêiner std::unordered_map
não armazena os elementos em ordem de classificação. Assim, o contêiner é usado principalmente para pesquisa de elemento e a posição não importa. Além disso, a posição dos elementos ao longo da vida útil do objeto não é garantida como fixa. Portanto, o programador deve tratar o pedido como indefinido.
O exemplo a seguir demonstra a inicialização da lista do contêiner unordered_map
e, em seguida, produz o conteúdo de ambos os mapas. Observe que a ordem decrescente dos elementos m1
não implica que eles sejam classificados.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
std::map<int, string> m2 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
printMap(m1);
printMap(m2);
return EXIT_SUCCESS;
}
Resultado:
4 : orange;
3 : grape;
2 : banana;
1 : apple;
1 : apple;
2 : banana;
3 : grape;
4 : orange;
Use a função de membro contains
para verificar se o elemento dado existe em um mapa em C++
A função de membro contains
faz parte do contêiner std::unordered_map
desde a atualização do C++ 20. Você pode usar a função para verificar se o elemento fornecido existe no mapa. Este comando aceita o valor-chave como o único argumento e retorna true
se a chave for encontrada. A função tem o tempo médio de execução constante, com o pior caso sendo o linear dependendo do tamanho do próprio contêiner.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
for (int x : {1, 2, 3, 4, 5}) {
if (m1.contains(x)) {
cout << x << ": Found\n";
} else {
cout << x << ": Not found\n";
}
}
return EXIT_SUCCESS;
}
Resultado:
1 : Found 2 : Found 3 : Found 4 : Found 5 : Not found
Use a função de membro erase
para remover o elemento específico de um mapa em C++
Você pode utilizar a função de membro erase
para remover o par de valores-chave fornecido do mapa. A função tem três sobrecargas, a primeira das quais leva o iterador para o elemento do mapa, que precisa ser removido do contêiner. A segunda sobrecarga de função leva dois iteradores para especificar o intervalo, que será removido do mapa. Esteja ciente de que o intervalo fornecido deve ser válido dentro do objeto contêiner de chamada. A terceira sobrecarga pode levar o valor-chave do elemento que deve ser removido.
No exemplo a seguir, removemos cada elemento que possui um número par como o valor-chave.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
for (auto it = m1.begin(); it != m1.end();) {
if (it->first % 2 == 0)
it = m1.erase(it);
else
++it;
}
printMap(m1);
return EXIT_SUCCESS;
}
Resultado:
3 : grape;
1 : apple;
Use a função de membro insert
para adicionar novos elementos a um mapa em C++
Outra função de membro central do contêiner unordered_map
é a função insert
, que você pode usar para adicionar novos elementos ao mapa. A função tem várias sobrecargas, mas utilizamos a primeira que usa apenas um par de valores-chave. Observe que também usamos a função std::make_pair
para construir um novo par com os valores de argumento fornecidos.
#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
vector<string> vec{"papaya", "olive", "melon"};
auto count = 0;
for (const auto& item : vec) {
m1.insert(std::make_pair(count, item));
}
printMap(m1);
return EXIT_SUCCESS;
}
Resultado:
0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook