Сохранение первого элемента карты в векторе в наиболее общей форме. Лучшее решение - PullRequest
0 голосов
/ 16 июля 2010

Моя цель - сохранить все ключи карты (первый элемент) для вектора, и я делаю следующее.

    template < class vecDet>
class storeInto
{
 public:
  storeInto(vecDet& source) : VectorInfo(source) { }
  ~storeInto();
  template <class pairdet>
  void operator()(pairdet& pairinfo) 
  {
   VectorInfo.push_back(pairinfo.first);
  }

 private:
  vecDet& VectorInfo;
};
template<class mapDet, class vecDet>
void storeMapToVector(const mapDet& mapContA,  vecDet& vecContA)
{
 for_each(mapContA.begin(), mapContA.end() , storeInto<vecDet>(vecContA));
}

Наконец, из моей основной программы я вызываю storeMapToVector () следующим образом

storeMapToVector<mapinfo,vector<char> >(mapContents, vecContents);

где mapinfo объявлено следующим образом

typedef map<char,int> mapinfo;

Есть ли лучший способ сделать это? Что-то не так с этим?

Ответы [ 2 ]

3 голосов
/ 16 июля 2010

Ваш код выглядит так, как будто он будет работать на первый взгляд.Однако есть гораздо более простой способ сделать это:

Я не оценил ваш код, но, безусловно, есть гораздо более простой способ сделать то, что вы хотите, встроенный в большинство реализаций STL:

vecContents.resize(mapContents.size());
std::transform(mapContents.begin(), mapContents.end(), vecContents.begin(),
    select1st<pair<const char, int> >());

В качестве альтернативы:

vecContents.resize(mapContents.size());
std::transform(mapContents.begin(), mapContents.end(), vecContents.begin(),
    select1st<mapinfo::value_type>());

Хотя есть 1 складка - select1st является расширением SGI.Это почти во всех реализациях STL, но где меняется.Для GNU вы должны сделать:

#include <ext/functional>

using __gnu_cxx::select1st; // or just using namespace __gnu_cxx;

См. этот ответ для использования его в Visual Studio.

0 голосов
/ 16 июля 2010

Код кажется нормальным. Некоторые щепки:

~storeInto();

Зачем тебе деструктор? Функтор мог бы просто жить без него.

storeMapToVector<mapinfo,vector<char> >(mapContents, vecContents);

Список аргументов шаблона здесь не нужен, просто может быть

storeMapToVector(mapContents, vecContents);

Параметры шаблона будут выведены в этом контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...