首页 > 解决方案 > 按类 C++ 的不同数据成员排序

问题描述

所以,我基本上学习了 C++ 中的类和模板函数。假设我有一个班级学生的记录,包括他们的卷号、姓名和总分。我正在使用索引排序对记录进行排序。现在可以根据姓名、卷或总分进行排序。如何使用模板函数合并所有三个?

class record{
  public:
  int roll;
  string name;
  int total;
};
void sort_name(int a[], record r[],int n)
{
  int temp;
  bool xchange = true;
  for(int pass=1;pass<n&&xchange==true;pass++)
  {
    for(int j=0;j<n-pass;j++)
    {
      if(r[a[j]].name>r[a[j+1]].name)
      {
        temp=a[j];
        a[j]=a[j+1];
        a[j+1] = temp;
      }
    }
  }
}

因此,我不想一次又一次地编写函数,而是想用 r[a[j]].roll 和 r[a[j]].total 替换 r[a[j]].name。那可能吗?

标签: c++classtemplatesnon-member-functions

解决方案


您可以将仿函数作为比较器传递给函数:

template <typename Comparator>
void my_sort(int a[], record r[],int n, Comparator comp)
{
    /*...*/ 
    if (comp(r[a[j], r[a[j+1]]) // instead of   if(r[a[j]].name>r[a[j+1]].name)
    /*...*/ 
}

然后您可以使用自定义谓词调用它,例如比较name成员:

my_sort(a,r,n,[](const record& a, const record& b) { return a.name < b.name; });

除非这是关于编写自己的排序例程的练习,否则您应该使用std::sort. 即使这样,您也可以查看如何std::sort让您通过自定义比较器并执行类似操作。


推荐阅读