【问题标题】:Copy map to vector将地图复制到矢量
【发布时间】:2010-08-05 01:31:53
【问题描述】:

我必须将某些元素从 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);

我是 lambda 表达式的新手,我不知道如何正确使用它们。 我在 Google 或 StackOverflow 上也没有得到任何有用的结果。 This question is similar

【问题讨论】:

    标签: map boost-lambda


    【解决方案1】:

    您在 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 算法同时执行这两个步骤(转换和条件复制)。

    【讨论】:

      【解决方案2】:

      您可以使用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));
      

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 2011-08-19
        • 2011-05-17
        • 1970-01-01
        相关资源
        最近更新 更多