2010-08-05 73 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); 
    } 
} 

因爲我想避免使用任何函子,而是使用boost ::拉姆達相反,我試圖使用的std ::複製,但無法得到它的權利。

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

我是新來的lambda表達式,我不知道如何正確使用它們。 我在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));