【教程】多级排序 C++

发布于:2024-12-08 ⋅ 阅读:(199) ⋅ 点赞:(0)

前言

在实际开发场景中,经常会出现多级排序的需要,例如一个商品,它由字段商品种类 ID,生产日期,保质期组成,要求对多个商品进行排序。

首先以商品种类 ID 升序排序,如果商品种类 ID 相同,则按照生产日期降序排序,如果生产日期也相同,则按照保质期升序排序

面对上面的场景,在 C++ 中我们可以利用 std::sort 函数来实现,其中 std::sort 的底层是快排算法

C++ 示例

如下我们定义一个叫做 Data 的结构体,接口体中包含 key1 ~ key3 三个字段,最终实现对 key1 ~ key3 分级的升序排序

typedef struct Data {
    int key1{0};
    int key2{0};
    int key3{0};
} Data;

比较函数,用来作为 std::sort 的第三个参数,指定排序的方式

bool compare(const Data& lhs, const Data& rhs) {
    // 首先比较 key1 的大小
    if (lhs.key1 != rhs.key1) return lhs.key1 < rhs.key1; // < 表示升序
    // 如果两个元素的 key1 相等,则比较 key2
    else {
        if (lhs.key2 != rhs.key2) return lhs.key2 < rhs.key2;
        // 如果两个元素的 key2 相等,则比较 key3
        else return lhs.key3 < rhs.key3;
    }
}

完整示例

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef struct Data {
    int key1{0};
    int key2{0};
    int key3{0};
} Data;

bool compare(const Data& lhs, const Data& rhs) {
    if (lhs.key1 != rhs.key1) return lhs.key1 < rhs.key1;
    else {
        if (lhs.key2 != rhs.key2) return lhs.key2 < rhs.key2;
        else return lhs.key3 < rhs.key3;
    }
}

int main() {
  Data data1{1,2,3};
  Data data2{2,2,4};
  Data data3{1,3,5};
  Data data4{3,1,3};
  Data data5{2,6,1};

  vector<Data> dataList{0};
  dataList.push_back(data1);
  dataList.push_back(data2);
  dataList.push_back(data3);
  dataList.push_back(data4);
  dataList.push_back(data5);

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

  for (auto data : dataList) {
    cout << "key1: " << data.key1 << " key2: " << data.key2 << " key3: " << data.key3 << endl;
  }

  return 0;
}

输出结果

key1: 1 key2: 2 key3: 3
key1: 1 key2: 3 key3: 5
key1: 2 key2: 2 key3: 4
key1: 2 key2: 6 key3: 1
key1: 3 key2: 1 key3: 3

网站公告

今日签到

点亮在社区的每一天
去签到