Скопировать карту в вектор
Я должен скопировать определенные элементы из std:: map в вектор. Это должно работать как в этом цикле:
typedef int First;
typedef void* Second;
std::map<First, Second> map;
// fill map
std::vector<Second> mVec;
for (std::map<First, Second>::const_iterator it = map.begin(); it != map.end(); ++it) {
if (it->first % 2 == 0) {
mVec.push_back (it->second);
}
}
Так как я хотел бы избежать использования каких-либо функторов, но вместо этого использовать boost:: lambda, я попытался использовать std::copy, но не могу сделать это правильно.
std::copy (map.begin(), map.end(), std::back_inserter(mVec)
bind(&std::map<int, void*>::value_type::first, _1) % 2 == 0);
Я новичок в лямбда-выражениях и не могу понять, как правильно их использовать. Я не получил никаких полезных результатов в Google или Stackru. Этот вопрос похож
2 ответа
Вы можете использовать адаптеры повышения диапазона для достижения этой цели.
using namespace boost::adaptors;
boost::copy( map | filtered( [] (const pair<First,Second> &p)->bool {return p.first % 2 == 0;})
| transformed( [] (const pair<First,Second> &p) {return p.second;}),
std::back_inserter(mVec));
В STL вам потребуется алгоритм transform_if. Тогда вам придется написать:
transform_if (mymap.begin(), mymap.end(),
back_inserter(myvec),
bind(&std::map<First, Second>::value_type::second, _1) ,
(bind(&std::map<First, Second>::value_type::first, _1) % 2) == 0 );
Код для transform_if взят из этого несвязанного вопроса, и это:
template<class InputIterator, class OutputIterator, class UnaryFunction, class Predicate>
OutputIterator transform_if(InputIterator first,
InputIterator last,
OutputIterator result,
UnaryFunction f,
Predicate pred)
{
for (; first != last; ++first)
{
if( pred(*first) )
*result++ = f(*first);
}
return result;
}
Я думаю, что нет другого способа выполнить оба шага (преобразование и условное копирование) одновременно, используя алгоритмы STL.