#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;}
);
Извините, что я не добавил никаких объяснений - я думал, что код настолько прост, что не требует никаких объяснений. Так:
transform( beginInputRange, endInputRange, outputIterator, unaryOperation)
эта функция вызывает unaryOperation
каждый элемент из inputIterator
диапазона ( beginInputRange
- endInputRange
). Значение операции сохраняется в outputIterator
.
Если мы хотим работать со всей картой - мы используем map.begin () и map.end () в качестве диапазона ввода. Мы хотим сохранить наши ценности карты в векторе - поэтому мы должны использовать back_inserter на нашем векторе: back_inserter(your_values_vector)
. Back_inserter - это специальный outputIterator, который подталкивает новые элементы в конец данной (как параметр) коллекции. Последний параметр - unaryOperation - принимает только один параметр - значение inputIterator. Таким образом, мы можем использовать лямбда :
[](auto &kv) { [...] }
, где & kv - это просто ссылка на пару элементов карты. Поэтому, если мы хотим вернуть только значения элементов карты, мы можем просто вернуть kv.second:
[](auto &kv) { return kv.second; }
Думаю, это объясняет любые сомнения.