portátil:
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());
creo que algunas implementaciones de STL tienen una extensión no estándar llamada select1st
, que es el equivalente de SelectKey
se muestra aquí. Como K-Ballo señaló en los comentarios, también hay una versión TR1. Me gusta la versión explícitamente nombrada, ya que es más fácil ver lo que está sucediendo.
Ya que no hay necesidad de estado, puede salirse con un poco menos repetitivo mediante el uso de una función real en lugar de un funtor:
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);
Si usted podría utilizar C++ 11, se puede usar una lambda, que mantiene el código de selección de cerca de donde se utiliza:
std::transform(m.cbegin(), m.cend(), std::back_inserter(v),
[](const std::pair<const F, S> &x) { return x.first; });
o incluso de rango basada en bucle, que es probablemente el más elegante y legible:
for(const auto &x : m) {
v.push_back(x.first);
}
Overkill? No está escribiendo demasiadas líneas de código para lograr esto de todos modos. –
@Als: por esa lógica, gran parte del algoritmo std :: es igualmente inútil. –
@Mahesh - Estaba pensando en alguna magia de inserción inversa, o algo –