Inserir novos elementos em um mapa STL em C++
-
Use a função de membro
insert
para adicionar um novo elemento astd::map
em C++ -
Use a função de membro
insert_or_assign
para adicionar um novo elemento astd::map
em C++ -
Use a função de membro
emplace
para adicionar um novo elemento astd::map
em C++ -
Use a função de membro
emplace_hint
para adicionar um novo elemento astd::map
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.
++ cCopy#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:
++ cCopyNot 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.
++ cCopy#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:
++ cCopyInserted 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.
++ cCopy#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:
++ cCopyInserted 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.
++ cCopy#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:
++ cCopyh : 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