Вы забыли using namespace std::tr1::placeholders
: P
Если честно, для простых алгоритмов, подобных этому, последний код, вероятно, проще поддерживать. Но я действительно склоняюсь к первому (особенно когда C ++ 1x дает нам лямбды!), Потому что он подчеркивает функциональный стиль программирования, который я лично предпочитаю императивному стилю использования цикла.
Это действительно другая вещь ударов; Стандартные алгоритмы наиболее полезны, когда они являются либо сложными, либо общими, и это ни то, ни другое.
Вот как это будет выглядеть с лямбдами:
std::transform(m.begin(), m.end(), std::back_insterter(v),
[](MyMap::value_type pair){ return pair.first; }
);
А на самом деле есть другой подход, который я бы предпочел, но из-за его многословия:
using std::tr1::bind;
using std::tr1::placeholders::_1;
std::for_each(m.begin(), m.end(),
bind(&std::vector<int>::push_back, v,
bind(&MyMap::value_type::first, _1)
)
);
И с лямбдами (это, вероятно, в общем и целом самый аккуратный и явный из всех вариантов):
std::for_each(m.begin(), m.end(),
[&v](MyMap::value_type pair){v.push_back(pair.first);}
);