2011-03-07 60 views
10

是否有返回p->firstp->second和内置函数对象,这样我可以愉快地写C++函数对象返回`P-> first`和`对 - >秒'

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

基于STL-溶液是最好的,boost解决方案是次佳。我知道boost::lambda,我不想开始使用它。

+1

看来你已经意识到在STL中没有直接的支持(或者可能是提升),为什么不写一个简单的函数模板来为你做这件事?它肯定比'bind'方法或非标准方法更清晰...... – Nim 2011-03-07 09:51:36

+1

@Nim,这可能是一个好主意,但是我总是害怕团队中的每个人都会拿出他自己的版本'littleTidbitMissingFromSpec',所以如果我能找到一些可靠的提升,那会更好。 – 2011-03-07 16:53:27

+0

一个有据可查的utils(或aux)命名空间是你需要的! ;) – Nim 2011-03-07 16:56:33

回答

9

g++SGI的非标准扩展名被称为select1stselect2nd。所以STL可能没有这个功能。

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

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

如果你可以使用C++ 0x中,因为G ++ 4.5您可以使用真正的lambda表达式,或者您可以使用新的与std :: pairs完全兼容的元组库。然后你可以使用std :: get < 0>来获得第一个,std :: get < 1>。

如果你绑定到C++ 98,你可以使用std :: tr1 :: tuple而不是std :: pair,就像在TR1中get不能和std :: pair一样。

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

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