C++中的排序操作:sort与自定义排序(自定义排序函数、匿名函数、运算符重载)

发布时间:2024年01月21日

在C++编程中,排序是一项常见而又重要的操作。本文将深入介绍C++标准库中的sort算法,以及如何利用其强大的自定义排序功能满足各种排序需求。

sort算法简介

C++标准库提供了sort算法,能够在O(N log N)的时间内对容器中的元素进行排序。这一高效的排序算法可以应用于数组、向量、链表等多种数据结构。

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> nums = {4, 2, 8, 5, 1, 7};
    std::sort(nums.begin(), nums.end());
    // 现在 nums = {1, 2, 4, 5, 7, 8}
    return 0;
}

自定义排序函数

sort算法还支持自定义排序函数,以满足更为复杂的排序需求。以下是一个自定义排序函数的示例,按照整数的绝对值进行排序:

#include <algorithm>
#include <vector>
#include <cmath>

bool compareAbsolute(int a, int b) {
    return std::abs(a) < std::abs(b);
}

int main() {
    std::vector<int> nums = {-4, 2, -8, 5, -1, 7};
    std::sort(nums.begin(), nums.end(), compareAbsolute);
    // 现在 nums = {-1, 2, -4, 5, 7, -8}
    return 0;
}

Lambda表达式自定义排序

C++11引入了Lambda表达式,使得自定义排序变得更加简洁。下面的示例展示了如何使用Lambda表达式按照奇偶性对整数进行排序:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> nums = {4, 2, 8, 5, 1, 7};
    std::sort(nums.begin(), nums.end(), [](int a, int b) {
        return a % 2 < b % 2;
    });
    // 现在 nums = {2, 4, 8, 1, 5, 7}
    return 0;
}

接下来,在Lambda表达式中,我们使用[](const auto& a, const auto& b)定义了一个匿名函数,通过a[2] < b[2]指定了按照二维数组中的第三个元素进行排序。

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

int main() {
    std::vector<std::vector<int>> twoDArray = {
        {1, 2, 5},
        {3, 4, 1},
        {5, 6, 3},
    };

    // 使用Lambda表达式定义排序规则
    std::sort(twoDArray.begin(), twoDArray.end(), [](const auto& a, const auto& b) {
        return a[2] < b[2];
    });

    // 输出排序结果
    for (const auto& row : twoDArray) {
        std::cout << "(" << row[0] << ", " << row[1] << ", " << row[2] << ") ";
    }

    return 0;
}

运算符重载自定义类型排序

如果涉及自定义类型,可以通过运算符重载来定义排序规则。以下示例展示了如何对自定义结构体按照年龄进行排序:

#include <algorithm>
#include <vector>

struct Person {
    std::string name;
    int age;

    // 运算符重载
    bool operator<(const Person& other) const {
        return age < other.age;
    }
};

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
    std::sort(people.begin(), people.end());
    // 现在 people = {{"Bob", 25}, {"Alice", 30}, {"Charlie", 35}}
    return 0;
}

通过深入理解sort算法以及各种自定义排序方法,C++开发者能够更好地应对不同场景下的排序需求,写出更灵活、高效的代码。在实际开发中,根据具体情况选择最合适的排序方式,将为项目的性能和可维护性带来积极的影响。

文章来源:https://blog.csdn.net/weixin_64632836/article/details/135729777
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。