Портативный:
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());
Я думаю, что некоторые реализации STL имеют нестандартное расширение, называемое select1st
, что является эквивалентом SelectKey
, показанным здесь. Как отметил K-Ballo в комментариях, есть также версия TR1. Мне нравится версия с явным именем, так как легче увидеть, что происходит.
Так как в состоянии нет необходимости, вы можете сэкономить немного меньше, используя реальную функцию, а не функтор:
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);
Если бы вы могли использовать C ++ 11 , вы могли бы использовать лямбду, в которой код выбора находится вблизи того места, где он используется:
std::transform(m.cbegin(), m.cend(), std::back_inserter(v),
[](const std::pair<const F, S> &x) { return x.first; });
или даже цикл for на основе диапазона, который, вероятно, самый элегантный и читаемый:
for(const auto &x : m) {
v.push_back(x.first);
}