如何将sort()的compare参数与模板和自定义数据结构一起使用

时间:2013-04-13 13:32:47

标签: c++ templates sorting stl

我想创建一个比较函数对象,它将帮助我对自定义数据结构的向量进行排序。我正在努力找出应该实现的确切位置以及因为我同时使用模板所需的任何其他代码。下面的大多数代码都可以忽略。包含它是为了完整性,但比较函数对象在printSummary()的最后使用。简而言之,我如何实现比较函数对象?

#include<map>
#include<vector>
//#include<iostream>
#include<algorithm>
using namespace std;

template <class T>
class Record{
   public:
   T item;
   int total;
};

   template<class T>
   bool compare(const Record<T> & a, const Record<T> & b){ //should a come before b?
      if(a.total > b.total)
         return true;
      if(a.total < b.total)
         return false;
      if(a.total == b.total){
         if(a.item < b.item)
            return true; 
         else
            return false;
      }
   }

template <class T>
class Counter{
   public:
      map<T, int> m;

   void printSummary(){

      typename map<T, int>::const_iterator itr; 
      vector< Record<T> > printlist;
      Record<T> temp;
      int i = 0;

      for( itr = m.begin(); itr != m.end(); ++itr ){
         temp.item = (*itr).first;
         temp.total = (*itr).second;
         printlist.push_back(temp);
         i++;
      }

      sort(printlist.begin(), printlist.end(), compare);

      //output sorted printlist contents
   }

};

2 个答案:

答案 0 :(得分:0)

在致电sort()时,您指定的是模板 的名称而未实例化

sort(printlist.begin(), printlist.end(), compare);
//                                       ^^^^^^^

函数模板的裸名称表示编译器的整个重载集(其中集合包括该模板的所有可能的特化)。

要消除歧义,您需要实例化compare<>()以提供一个功能的地址:

sort(printlist.begin(), printlist.end(), compare<T>);
//                                              ^^^

或者,您可以将compare作为仿函数

struct compare
{
   template<class T>
   bool operator () (const Record<T> & a, const Record<T> & b)
   {
      // should a come before b?
      if(a.total > b.total)
         return true;
      if(a.total < b.total)
         return false;
      if(a.total == b.total){
         if(a.item < b.item)
            return true; 
         else
            return false;
      }
   }
};

然后,您可以通过这种方式将其传递给sort(),无需模板实例化(但您需要创建一个仿函数的实例,尽管暂时没问题,如下所示):

sort(printlist.begin(), printlist.end(), compare());
//                                       ^^^^^^^^^

答案 1 :(得分:0)

到目前为止这看起来很好,您只能使用compare

类型来限定T
sort(printlist.begin(), printlist.end(), compare<T>);

在比较功能中,您可以省略

if(a.total == b.total){

因为在那一点上,它始终是平等的。你可以将其减少到

if (a.total > b.total)
    return true;

if (a.total < b.total)
    return false;

return a.item < b.item;