2010-02-22 19 views
12

Tengo la siguiente estructura de mapa: map < pair < int,int >, object* > y deseo insertar en ella.Cómo insertar un par en el mapa

¿Cómo iba a hacerlo ya que estoy tratando de insertar un par y un objeto y tengo que hacer un par de esto?

¿Debo crear un nuevo par usando make_pair() del par y el objeto que tengo? Si es así, ¿podría decirme cómo hacerlo?

+5

¿Qué código ha intentado? – Mark

Respuesta

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

o

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

Utilicé su primera sugerencia: agradable y concisa. ¡Muchas gracias! – Myx

+2

Si está utilizando esto mucho en su código, es posible que desee envolver el mapa en una clase con una función de inserción (par, objeto) para facilitar la lectura. –

1

Hay dos maneras:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. Sólo funciona si la clave no está presente, los puntos de iterador a la par con el valor de la clave y el bool indica si se ha insertado o no.

  2. más fácil, pero si no existe ya el objeto está construido primero por defecto y luego asignado en lugar de ser construido copia

Si usted no tiene que preocuparse por el rendimiento, acaba de elegir por si o no desea borrar la entrada anterior.

+0

Correcto, pero la pregunta sobre un mapa con un tipo de clave que también es un par. –

+0

No veo la dependencia. 'sed s/1/std :: make_pair (1,1)/g' y un' map_t' adecuadamente definido. No cambia los comentarios ni nada, solo prefiero demostrar con conceptos simples para ayudar a centrarme en los puntos importantes en lugar de esconderlos en la multitud. –

10

Suponiendo que estamos usando C++ 11 o posterior, el mejor enfoque es probablemente:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

Para mapas, emplace puede ser pensado como una versión de insert que toma la clave y el valor como algo separado argumentos (en realidad puede tomar cualquier combinación de argumentos que puedan tomar los constructores del tipo pair correspondientes). Además de ser sintácticamente más limpio, también es potencialmente más eficiente que make_pair, porque make_pair generalmente producirá una salida cuyo tipo no coincide exactamente con el value_type del contenedor, por lo que incurre en una conversión de tipo innecesaria.

Solía ​​recomendar este, que también sólo funciona en C++ 11 o posterior:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

Esto evita el uso de un poco sorprendente emplace, pero que antes no funcionaba si la clave o el valor tipo son de solo movimiento (por ejemplo, unique_ptr). Eso se ha corregido en el estándar, pero la implementación de su biblioteca estándar puede no haber resuelto la corrección todavía. En teoría, esto también podría ser ligeramente menos eficiente, pero de una manera que cualquier compilador medio decente puede optimizar fácilmente.

+0

Creo que la respuesta oficial y esta debería fusionarse según los criterios de la versión del compilador – Aviv

Cuestiones relacionadas