programacion - insertar elementos en una lista c++
Forma recomendada de insertar elementos en el mapa (4)
-
insert
no es una forma recomendada, es una de las formas de insertar en el mapa. La diferencia con eloperator[]
es que lainsert
puede indicar si el elemento está insertado en el mapa. Además, si su clase no tiene un constructor predeterminado, se verá obligado a utilizarinsert
. -
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");
}
- 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á utilizandoinsert
una forma recomendada? - ¿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
- Actuación
- Disponibilidad del constructor predeterminado del valor
- ???
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[]
.