2010-12-07 20 views
19

¿Existe un iterador estándar que pueda usar para insertar elementos en std :: map utilizando un algoritmo std (por ejemplo, std :: copy)?Cómo insertar en std :: map?

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

Respuesta

23

creo que lo que el PO está buscando es std::inserter(mymap, mymap.end())

lo que puede hacer:

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

Los tipos de entrada debe ser un tipo de pareja que lleva su mapa, de lo contrario su algoritmo necesitaría ser std :: transform con una funcion/functor para convertir el tipo de entrada en tal std :: pair.

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

+3

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

12

Para insertar en std::map, necesita usar std::make_pair().

Por ejemplo:

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

intentar algo similar. :)

+2

Esto no es lo que él está buscando. Él 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. – CadentOrange

+0

Alrededor del momento en que esta pregunta fue hecha y respondida, estaba un poco obsesionado con los puntos de reputación aquí, y de hecho sospeché algo sobre Prasoon que logró obtener 13 votos favorables para respuestas como esta. – CashCow

+0

No es una respuesta a la pregunta: "¿Hay un iterador estándar que podría usar ...?" – dmitri

4

Sí, std::copy pueden insertar varios elementos en un mapa, si se utiliza un std::insert_iterator como el OutputIterator (utilizar la función auxiliar std::inserter para crear estos, de esta manera, el tipo de plantilla se puede inferir). Los "elementos" de un std :: map son pares clave-valor, que puede crear con std::make_pair, como lo ilustra Prasoon. (El tipo real es std::pair<Key, Value>; de nuevo, la función auxiliar 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.

Cuestiones relacionadas