una programacion lista insertar eliminar elementos elemento ejemplos código colas cola buscar ats agregar c++ stl stdmap

programacion - insertar elementos en una lista c++



Forma recomendada de insertar elementos en el mapa (4)

  1. insert no es una forma recomendada, es una de las formas de insertar en el mapa. La diferencia con el operator[] es que la insert puede indicar si el elemento está insertado en el mapa. Además, si su clase no tiene un constructor predeterminado, se verá obligado a utilizar insert .
  2. operator[] necesita el constructor predeterminado porque el mapa verifica si el elemento existe. Si no lo hace, entonces crea uno usando el constructor predeterminado y devuelve una referencia (o referencia a ella).

Debido a que los contenedores de mapas no permiten duplicar valores de clave, la operación de inserción comprueba si cada elemento insertado ya existe otro elemento en el contenedor con el mismo valor clave, si es así, el elemento no se inserta y su valor asignado no cambia en ningún camino.

Posible duplicado:
En los mapas STL, ¿es mejor usar map :: insert que []?

Me preguntaba, cuando inserto el elemento en el mapa, ¿cuál es la forma recomendada? Debería

map[key] = value;

o

map.insert(std::pair<key_type, value_type>(key, value));

Hice la siguiente prueba rápida:

#include <map> #include <string> #include <iostream> class Food { public: Food(const std::string& name) : name(name) { std::cout << "constructor with string parameter" << std::endl; } Food(const Food& f) : name(f.name) { std::cout << "copy" << std::endl; } Food& operator=(const Food& f) { name = f.name; std::cout << "=" << std::endl; return *this; } Food() { std::cout << "default" << std::endl; } std::string name; }; int main() { std::map<std::string, Food> m0; /* 1) constructor with string parameter 2) copy 3) copy 4) copy */ m0.insert(std::pair<std::string, Food>("Key", Food("Ice Cream"))); /* 1) constructor with string parameter 2) default 3) copy 4) copy 5) = */ // If we do not provide default constructor. // C2512: ''Food::Food'' : no appropriate default constructor available m0["Key"] = Food("Ice Cream"); }

  1. Me doy cuenta que al usar la insert función de miembro, la llamada a la función de menos valor estará involucrada. Entonces, ¿está utilizando insert una forma recomendada?
  2. ¿Por qué se necesita el constructor predeterminado, cuando se está utilizando map[key] = value ?

Sé que el insert no sobrescribe el par de valores clave de existencia, pero el map[key] = value sí lo hace. Sin embargo, ¿es este el único factor que tomo en consideración cuando trato de elegir entre ambos?

Qué tal si

  1. Actuación
  2. Disponibilidad del constructor predeterminado del valor
  3. ???

Citar:

Debido a que los contenedores de mapas no permiten duplicar valores de clave, la operación de inserción comprueba si cada elemento insertado ya existe otro elemento en el contenedor con el mismo valor clave, si es así, el elemento no se inserta y su valor asignado no cambia en ningún camino.

Entonces insertar no cambiará el valor si la clave ya existe, el operador [] lo hará.

EDITAR:

Esto me recuerda otra pregunta reciente: por qué utilizar en () en lugar del operador [] para recuperar valores de un vector. Aparentemente en () arroja una excepción si el índice está fuera de límites mientras que [] no. En estas situaciones, siempre es mejor buscar la documentación de las funciones, ya que le darán todos los detalles. Pero en general, no hay (o al menos no debería haber) dos funciones / operadores que hagan exactamente lo mismo.

Supongo que, internamente, insert () primero verificará la entrada y luego usará el operador [].


Use insert si desea insertar un nuevo elemento. insert no sobrescribirá un elemento existente, y usted puede verificar que no haya ningún elemento existente anteriormente:

if ( !myMap.insert( std::make_pair( key, value ) ).second ) { // Element already present... }

Utilice [] si desea sobrescribir un elemento posiblemente existente:

myMap[ key ] = value; assert( myMap.find( key )->second == value ); // post-condition

Este formulario sobrescribirá cualquier entrada existente.


map[key] = value se proporciona para una sintaxis más fácil. Es más fácil de leer y escribir.

La razón por la cual necesita tener un constructor predeterminado es que el map[key] se evalúa antes de la asignación. Si la clave no estaba presente en el mapa, se crea una nueva (con el constructor predeterminado) y se devuelve una referencia a ella desde el operator[] .