#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;}
);
Spiacente di non aver aggiunto alcuna spiegazione: ho pensato che il codice sia così semplice che non richiede alcuna spiegazione. Quindi:
transform(beginInputRange, endInputRange, outputIterator, unaryOperation)
Questa funzione chiama unaryOperation
su ogni elemento dalla inputIterator
gamma (beginInputRange
-endInputRange
). Il valore dell'operazione è memorizzato in outputIterator
.
Se vogliamo operare attraverso l'intera mappa, utilizziamo map.begin() e map.end() come intervallo di input. Vogliamo memorizzare i nostri valori di mappa in vettoriale, quindi dobbiamo utilizzare back_inserter sul nostro vettore: back_inserter(your_values_vector)
. Il back_inserter è outputIterator speciale che spinge i nuovi elementi alla fine della raccolta data (come paremeter). L'ultimo parametro è unario. Operazione: richiede un solo parametro: il valore di inputIterator. Quindi possiamo usare lambda: [](auto &kv) { [...] }
, dove & kv è solo un riferimento alla coppia di elementi della mappa. Quindi, se vogliamo tornare solo i valori degli elementi della mappa possiamo semplicemente tornare kv.second:
[](auto &kv) { return kv.second; }
Penso che questo spiega dubbi.
Python mi ha veramente viziato :-( –
Bello, il modello Forse dargli un iteratore di output invece di un contenitore! – xtofl
La soluzione di Skurmedel è ancora più bella: usa la funzione 'trasforma' con ap -> p.second functor. – xtofl