2010-08-05 1 views
0

Мне нужно скопировать некоторые элементы из 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); 
    } 
} 

Так как я хотел бы избежать использования каких-либо функторы, но и использовать повышение :: лямбда вместо этого, я попытался с помощью зЬй :: копировать, но не может получить это право ,

std::copy (map.begin(), map.end(), std::back_inserter(mVec) 
       bind(&std::map<int, void*>::value_type::first, _1) % 2 == 0); 

Я новичок в лямбда-выражениях, и я не могу понять, как их правильно использовать. Я тоже не получал полезных результатов в Google или StackOverflow. This question is similar

ответ

0

Что вам понадобится в 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 берется из this unrelated question и это:

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.

0

Для этого вы можете использовать boost range adaptors.

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));