Portatile:
struct SelectKey {
template <typename F, typename S>
F operator()(const std::pair<const F, S> &x) const { return x.first; }
};
std::transform(m.cbegin(), m.cend(), std::back_inserter(v), SelectKey());
penso che alcune implementazioni di STL hanno estensione non-standard chiamato select1st
, che è l'equivalente di SelectKey
mostrato qui. Come ha sottolineato K-Ballo nei commenti, c'è anche una versione TR1. Mi piace la versione con il nome esplicito in quanto è più facile vedere cosa sta succedendo.
Dal momento che non c'è bisogno di stato, è possibile cavarsela con un po 'meno boilerplate utilizzando una funzione reale, piuttosto che un funtore:
template <typename F, typename S>
F SelectKey()(const std::pair<const F, S> &x) { return x.first; }
std::transform(m.cbegin(), m.cend(), std::back_inserter(v), SelectKey);
Se si potesse utilizzare C++ 11, è possibile utilizzare un lambda, che mantiene il codice di scelta vicino a dove viene utilizzato:
std::transform(m.cbegin(), m.cend(), std::back_inserter(v),
[](const std::pair<const F, S> &x) { return x.first; });
o addirittura gamma-based per-loop, che è probabilmente la più elegante e leggibile:
for(const auto &x : m) {
v.push_back(x.first);
}
fonte
2011-10-05 20:53:26
Overkill? Non stai digitando troppe righe di codice per ottenerlo comunque. –
@Als: da quella logica molto di std :: l'algoritmo è ugualmente inutile. –
@Mahesh - Stavo pensando a qualche magia di back-inserter, o qualcosa del genere –