C ++函数对象返回'p-> first`和`p-> second`

时间:2011-03-07 09:38:21

标签: c++ boost stl

是否有内置函数对象返回p->firstp->second,以便我可以高兴地写

transform(m.begin(),m.end(),back_inserter(keys),get_first);
transform(m.begin(),m.end(),back_inserter(vals),get_second);

基于STL的解决方案是最好的,boost解决方案是第二好的。

是的,我知道boost::lambda,我不想开始使用它。

3 个答案:

答案 0 :(得分:9)

g++SGI的非标准扩展名为select1stselect2nd。因此STL中可能没有任何内容。

Boost的绑定也可以这样做,给它一个指向正确成员函数的指针

boost::bind(&std::map<string,string>::value_type::second,_1)

答案 1 :(得分:4)

我们可以轻松编写select1st和select2nd:

struct select1st
{
   template< typename K, typename V >
   const K& operator()( std::pair<K,V> const& p ) const
   {
       return p.first;
   }
};

struct select2nd
{
   template< typename K, typename V >
   const V& operator()( std::pair<K,V> const& p ) const
   {
       return p.second;
   }
};

这是另一种实际上更灵活的版本:

struct select1st
{
   template< typename P >
   typename P::first_type const& operator()( P const& p ) const
   {
       return p.first;
   }
};

struct select2nd
{
   template< typename P >
   typename P::second_type const& operator()( P const& p ) const
   {
       return p.second;
   }
};

随后:

transform(m.begin(),m.end(),back_inserter(keys), select1st());
transform(m.begin(),m.end(),back_inserter(vals), select2nd());

答案 2 :(得分:2)

如果您可以使用C ++ 0x,您可以使用自G ++ 4.5以来的真正lambdas,或者您可以使用与std :: pairs完全兼容的新元组库。然后你可以使用std :: get&lt; 0&gt;对于first和std :: get&lt; 1&gt;第二次。

如果你被绑定到C ++ 98,你可以使用std :: tr1 :: tuple而不是std :: pair,因为在TR1中get不能用于std :: pair。

你也可以使用来自TR1(tr1 / functional)的绑定,就像Elazar描述的那样。