是否有内置函数对象返回p->first
和p->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
,我不想开始使用它。
答案 0 :(得分:9)
g++
和SGI
的非标准扩展名为select1st
和select2nd
。因此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描述的那样。