21xrx.com
2024-11-05 19:32:17 Tuesday
登录
文章检索 我的文章 写文章
C++自定义排序规则
2023-06-27 06:54:32 深夜i     --     --
C++ 自定义 排序规则

在C++中,排序是一项基本的操作。但是,C++中提供的排序算法不能满足所有的排序需求。有时候,我们需要按照某种特殊的规则来排序。这时候,我们就需要自定义排序规则。

在C++中,我们可以使用函数指针或者函数对象来自定义排序规则。下面我们分别来介绍一下这两种方法。

使用函数指针自定义排序规则

使用函数指针来自定义排序规则的方法非常简单。我们只需要编写一个函数,该函数的参数为两个需要比较的元素,返回值为bool类型,表示它们的相对顺序。然后将这个函数的地址传给排序函数即可。

例如,我们需要按照以下的规则来对int数组进行排序:

- 奇数在前,偶数在后;

- 奇数按照降序排列,偶数按照升序排列。

代码如下:


bool cmp(int a, int b) {

  if (a % 2 == 1 && b % 2 == 0) return true; // 奇数在前,偶数在后

  if (a % 2 == 0 && b % 2 == 1) return false;

  if (a % 2 == 1 && b % 2 == 1) return a > b; // 奇数按照降序排列

  if (a % 2 == 0 && b % 2 == 0) return a < b; // 偶数按照升序排列

}

int main() {

  int arr[10] = 5;

  sort(arr, arr + 10, cmp);

  for (int i = 0; i < 10; i++) {

    cout << arr[i] << " ";

  }

  return 0;

}

使用函数对象自定义排序规则

使用函数对象(即重载运算符()的类)来自定义排序规则也非常简单。我们只需要编写一个类,并重载运算符(),该运算符的参数为两个需要比较的元素,返回值也是bool类型,表示它们的相对顺序。然后将这个类的对象传给排序函数即可。

例如,我们需要按照以下规则来对Person对象的数组进行排序:

- 按照年龄排序,年龄相同的按照姓名排序;

- 年龄相同且姓名相同的按照身高排序,身高相同的按照体重排序。

代码如下:


class Person {

public:

  string name;

  int age;

  double height;

  double weight;

  // 重载小于运算符

  bool operator < (const Person& p) const {

    if (age != p.age) return age < p.age; // 按照年龄排序

    if (name != p.name) return name < p.name; // 年龄相同的按照姓名排序

    if (height != p.height) return height < p.height; // 年龄和姓名都相同的按照身高排序

    return weight < p.weight; // 身高也相同的按照体重排序

  }

};

int main() {

  Person people[4] = { 60, 55, 70, 50};

  sort(people, people + 4);

  for (int i = 0; i < 4; i++) {

    cout << people[i].name << " " << people[i].age << " " << people[i].height << " " << people[i].weight << endl;

  }

  return 0;

}

总结

在C++中,自定义排序规则非常简单,只需要编写一个函数或者函数对象即可。这样就可以满足各种排序需求了。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复