Use o contêiner de mapa STL não ordenado em C++

Jinku Hu 12 outubro 2023
  1. Use o elemento std::unordered_map para declarar um contêiner de mapa não ordenado em C++
  2. Use a função de membro contains para verificar se o elemento dado existe em um mapa em C++
  3. Use a função de membro erase para remover o elemento específico de um mapa em C++
  4. Use a função de membro insert para adicionar novos elementos a um mapa em C++
Use o contêiner de mapa STL não ordenado 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;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artigo relacionado - C++ Map