Inserir novos elementos em um mapa STL em C++

Jinku Hu 12 outubro 2023
  1. Use a função de membro insert para adicionar um novo elemento a std::map em C++
  2. Use a função de membro insert_or_assign para adicionar um novo elemento a std::map em C++
  3. Use a função de membro emplace para adicionar um novo elemento a std::map em C++
  4. Use a função de membro emplace_hint para adicionar um novo elemento a std::map em C++
Inserir novos elementos em um mapa STL em C++

Este artigo irá explicar vários métodos de como adicionar novos elementos no objeto std::map em C++.

Use a função de membro insert para adicionar um novo elemento a std::map em C++

O contêiner STL map fornece uma estrutura de dados para armazenar pares de valores-chave como elementos, classificados automaticamente na inserção ou inicialização. Novos elementos podem ser adicionados a um objeto std::map usando vários métodos, o mais comum dos quais é a função insert.

A função de membro insert tem várias sobrecargas. Ainda assim, o mais simples leva apenas um único argumento especificando a referência const para o objeto inserido. Outra sobrecarga pode aceitar uma referência de valor r e usar o comando std::forward para construir um elemento no local, conforme mostrado no código de exemplo a seguir.

A última sobrecarga retorna um par do iterador para o elemento inserido e o valor bool, indicando a inserção bem-sucedida. Também demonstramos uma sobrecarga da função insert que obtém uma lista de valores-chave semelhantes à lista de inicializadores e constrói elementos a partir dos valores. No entanto, essa sobrecarga não possui um tipo de retorno.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert({"k", "ktop"});
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << "\n";

  m1.insert({{"k", "ktop"}, {"p", "ptop"}});
  printMap(m1);

  return EXIT_SUCCESS;
}

Resultado:

Not Inserted h : htop;
k : ktop;
p : ptop;

Use a função de membro insert_or_assign para adicionar um novo elemento a std::map em C++

O padrão C++ 17 mais recente fornece uma função de membro chamada insert_or_assign, que insere um novo elemento em um mapa se a chave fornecida ainda não existir. Caso contrário, a função atribuirá o novo valor ao elemento com a chave existente.

A função tem várias sobrecargas, mas aquela chamada no exemplo a seguir leva dois argumentos como referências de valor r para uma chave e um valor. Essa sobrecarga também retorna um par de iterador e um valor bool. Observe que verificamos o status da inserção com um operador condicional e imprimimos as mensagens correspondentes.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert_or_assign("p", "ptop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  ret = m1.insert_or_assign("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  printMap(m1);

  return EXIT_SUCCESS;
}

Resultado:

Inserted Inserted h : htop;
k : ktop;
p : ptop;
t : ttop;

Use a função de membro emplace para adicionar um novo elemento a std::map em C++

Outra função de membro fornecida com o contêiner std::map é emplace. Esta função fornece eficiência em contraste com a função insert, pois não requer a cópia dos valores dos argumentos. Ao contrário, a função emplace construirá o elemento no local, o que significa que os parâmetros fornecidos são encaminhados para o construtor da classe. Observe que, dependendo dos argumentos, o construtor correspondente será chamado.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  ret = m1.emplace(std::make_pair("t", "ttop"));
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  printMap(m1);

  return EXIT_SUCCESS;
}

Resultado:

Inserted Not Inserted h : htop;
k : ktop;
t : ttop;

Use a função de membro emplace_hint para adicionar um novo elemento a std::map em C++

Alternativamente, pode-se utilizar a função de membro emplace_hint para inserir um novo elemento em um mapa com um parâmetro adicional chamado hint, que especifica uma posição onde a operação deve começar a pesquisar. Ele retornaria um iterador para o elemento recém-inserido se o processo fosse bem-sucedido. Caso contrário, o iterador para o elemento existente com a mesma chave é retornado.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");

  m1.emplace_hint(ret, "m", "mtop");
  m1.emplace_hint(m1.begin(), "p", "ptop");

  printMap(m1);

  return EXIT_SUCCESS;
}

Resultado:

h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
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