Insertar nuevos elementos en un mapa STL en C++

Jinku Hu 12 octubre 2023
  1. Utilice la función de miembro insert para agregar un nuevo elemento a std::map en C++
  2. Utilice la función de miembro insert_or_assign para agregar un nuevo elemento a std::map en C++
  3. Utilice la función de miembro emplace para agregar un nuevo elemento a std::map en C++
  4. Utilice la función miembro emplace_hint para agregar un nuevo elemento a std::map en C++
Insertar nuevos elementos en un mapa STL en C++

Este artículo explicará varios métodos de cómo agregar nuevos elementos en el objeto std::map en C++.

Utilice la función de miembro insert para agregar un nuevo elemento a std::map en C++

El contenedor STL map proporciona una estructura de datos para almacenar pares clave-valor como elementos, ordenados automáticamente tras la inserción o inicialización. Se pueden agregar nuevos elementos a un objeto std::map usando varios métodos, el más común de los cuales es la función insert.

La función miembro insert tiene múltiples sobrecargas. Aún así, el más simple toma solo un único argumento que especifica la referencia const al objeto insertado. Otra sobrecarga puede aceptar una referencia de valor r y usar el comando std::forward para construir un elemento en el lugar, como se muestra en el siguiente código de muestra.

La última sobrecarga devuelve un par del iterador al elemento insertado y el valor bool, lo que indica una inserción exitosa. También demostramos una sobrecarga de la función insert que toma una lista de valores-clave similar a la lista del inicializador y construye elementos a partir de los valores. Sin embargo, esta sobrecarga no tiene un 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;
}

Producción :

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

Utilice la función de miembro insert_or_assign para agregar un nuevo elemento a std::map en C++

El estándar C++ 17 más nuevo proporciona una función miembro llamada insert_or_assign, que inserta un nuevo elemento en un mapa si la clave dada aún no existe. De lo contrario, la función asignará el nuevo valor al elemento con la clave existente.

La función tiene varias sobrecargas, pero la llamada en el siguiente ejemplo toma dos argumentos como referencias de valor r a una clave y un valor. Esta sobrecarga también devuelve un par de iterador y un valor bool. Observe que verificamos el estado de la inserción con un operador condicional e imprimimos los mensajes correspondientes.

#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;
}

Producción :

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

Utilice la función de miembro emplace para agregar un nuevo elemento a std::map en C++

Otra función miembro proporcionada con el contenedor std::map es emplace. Esta función proporciona eficiencia en contraste con la función insert ya que no requiere copiar los valores de los argumentos. Por el contrario, la función emplazamiento construirá el elemento en el lugar, lo que significa que los parámetros dados se reenvían al constructor de la clase. Tenga en cuenta que, dependiendo de los argumentos, se llamará al constructor correspondiente.

#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;
}

Producción :

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

Utilice la función miembro emplace_hint para agregar un nuevo elemento a std::map en C++

Alternativamente, se puede utilizar la función miembro emplace_hint para insertar un nuevo elemento en un mapa con un parámetro adicional llamado hint, que especifica una posición en la que la operación debe comenzar a buscar. Devolvería un iterador al elemento recién insertado si el proceso fuera exitoso. De lo contrario, se devuelve el iterador del elemento existente con la misma clave.

#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;
}

Producción :

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

Artículo relacionado - C++ Map