¿Cómo insertar en std::map?

2 minutos de lectura

Avatar de usuario de BЈовић
BЈовић

¿Hay algún iterador estándar que pueda usar para insertar elementos en std::map usando un algoritmo estándar (por ejemplo, std::copy)?

Necesito un contenedor para vincular un objeto a una cadena y pensé en usar std::map. ¿Hay un contenedor mejor? Se me olvidó decir que es necesario ordenar los artículos.

Avatar de usuario de CashCow
Vaca Efectiva

Creo que lo que busca el OP es std::inserter(mymap, mymap.end())

para que puedas hacer:

std::copy( inp.begin(), inp.end(), std::inserter(mymap, mymap.end()) );

Los tipos de entrada deben ser un tipo de par que tome su mapa; de lo contrario, su algoritmo tendría que ser std::transform con una función/functor para convertir el tipo de entrada en tal std::pair.

inserter no es en realidad un iterador sino una función con plantilla que produce un iterador (std::insert_iteratorque es un tipo con plantilla pero el tipo se resuelve automáticamente en la llamada de función).

  • Si el rango de entrada está ordenado, usando .begin() para el segundo parámetro debería hacer las cosas más rápido. De lo contrario, realmente no importa. Ver por ejemplo sgi.com/tech/stl/insert_iterator.html .

    – Karl Knechtel

    7 de diciembre de 2010 a las 9:48


Para insertar en std::map necesitas usar std::make_pair().

Por ejemplo:

std::map<int,std::string> Map;
Map.insert(std::make_pair(5,"Hello"));

Prueba algo similar. 🙂

  • Esto no es lo que busca. No está preguntando cómo insertar un elemento en un mapa. Está buscando una forma de insertar elementos en un mapa utilizando uno de los algoritmos STL.

    – Naranja cadente

    7 de diciembre de 2010 a las 10:19

  • En el momento en que se hizo y respondió esta pregunta, estaba un poco obsesionado con los puntos de reputación aquí, y en realidad sospeché algo sobre Prasoon, que logró obtener 13 votos a favor para respuestas como esta.

    – CashCow

    19 de diciembre de 2013 a las 12:55

  • No es una respuesta a la pregunta: “¿Hay algún iterador estándar que pueda usar…?”

    – dmitri

    16 de diciembre de 2016 a las 1:18

Sí, std::copy puede insertar varios elementos en un mapa, si utiliza un std::insert_iterator como OutputIterator (use la función auxiliar std::inserter para crear estos; de esta manera, se puede inferir el tipo de plantilla). Los “elementos” de un std::map son pares clave-valor, que puede crear con std::make_pair, como ilustra Prasoon. (El tipo real es std::pair<Key, Value>; de nuevo, la función de ayuda permite la deducción del tipo de plantilla.) Si tiene las claves en una secuencia y los valores en otra, debería poder usar std::transform para producir una secuencia de pares clave-valor.

¿Ha sido útil esta solución?