Inserir novos elementos em um mapa STL em C++
- 
          
            Use a função de membro insertpara adicionar um novo elemento astd::mapem C++
- 
          
            Use a função de membro insert_or_assignpara adicionar um novo elemento astd::mapem C++
- 
          
            Use a função de membro emplacepara adicionar um novo elemento astd::mapem C++
- 
          
            Use a função de membro emplace_hintpara adicionar um novo elemento astd::mapem 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;
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