Функциональный объект C ++ для возврата `p-> first` и` p-> second` - PullRequest
10 голосов
/ 07 марта 2011

Есть ли встроенный объект-функция, который возвращает 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, я не хочу его использовать.

Ответы [ 3 ]

9 голосов
/ 07 марта 2011

Существуют нестандартные расширения для g++ и SGI, называемые select1st и select2nd.Так что, вероятно, в STL для этого ничего нет.

Привязка Boost также может сделать это, дать ему указатель на правильную функцию-член

boost::bind(&std::map<string,string>::value_type::second,_1)
4 голосов
/ 07 марта 2011

Мы можем легко написать 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 голосов
/ 07 марта 2011

Если вы можете использовать C ++ 0x, вы можете использовать настоящие лямбды начиная с G ++ 4.5 или использовать новую библиотеку кортежей, которая полностью совместима с std :: pair.Тогда вы можете использовать std :: get <0> для первого и std :: get <1> для второго.

Если вы связаны с C ++ 98, вы можете использовать вместо него std :: tr1 :: tuplestd :: pair, как в TR1, get не работает с std :: pair.

Также вы можете использовать связывание из TR1 (tr1 / функциональный), как это описал Elazar.

...