我們可以很容易地編寫一個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());
看來你已經意識到在STL中沒有直接的支持(或者可能是提升),爲什麼不寫一個簡單的函數模板來爲你做這件事?它肯定比'bind'方法或非標準方法更清晰...... – Nim 2011-03-07 09:51:36
@Nim,這可能是一個好主意,但是我總是害怕團隊中的每個人都會拿出他自己的版本'littleTidbitMissingFromSpec',所以如果我能找到一些可靠的提升,那會更好。 – 2011-03-07 16:53:27
一個有據可查的utils(或aux)命名空間是你需要的! ;) – Nim 2011-03-07 16:56:33