#include <algorithm> // std::transform
#include <iterator> // std::back_inserter
std::transform(
your_map.begin(),
your_map.end(),
std::back_inserter(your_values_vector),
[](auto &kv){ return kv.second;}
);
Disculpa que no he añadido ninguna explicación. Creo que el código es tan simple que no requiere ninguna explicación. Así :
transform(beginInputRange, endInputRange, outputIterator, unaryOperation)
Esta función llama unaryOperation
en cada artículo de inputIterator
gama (beginInputRange
-endInputRange
). El valor de la operación se almacena en outputIterator
.
Si queremos operar a través de un mapa completo, utilizamos map.begin() y map.end() como nuestro rango de entrada. Queremos almacenar nuestros valores de mapa en vector, por lo que debemos usar back_inserter en nuestro vector: back_inserter(your_values_vector)
. El back_inserter es un outputIterator especial que empuja los nuevos elementos al final de la colección dada (como parámetro). El último parámetro es unaryOperation - toma solo un parámetro - value de InputIterator. Entonces podemos usar lambda: [](auto &kv) { [...] }
, donde & kv es solo una referencia al par del elemento del mapa. Así que si queremos volver sólo valores de los elementos del mapa podemos simplemente volver kv.second:
[](auto &kv) { return kv.second; }
Creo que esto explica las dudas.
Python realmente me ha echado a perder :-( –
Bien, la plantilla. Tal vez darle un iterador de salida en lugar de un contenedor! – xtofl
La solución de Skurmedel es aún mejor: use la función 'transformar' con un p-> p.segundo functor. – xtofl