当前位置: 首页 > article >正文

C++|sort函数

参考:C++中sort函数使用方法

文章目录

  • 头文件
  • 函数原型
  • 参数说明
  • 示例
  • 多样化数据类型和自定义比较
  • 如何反向排序?
    • 使用 `std::greater`
    • 自定义比较函数
    • 使用Lambda表达式

在C++中, sort 函数是一个标准库算法,用于对数组或容器中的元素进行排序。它定义在 <algorithm> 头文件中。

头文件

#include <algorithm> // 包含sort函数

函数原型

sort 函数有两种形式的原型:

  1. 对于数组或类似数组的对象:
void sort(ForwardIterator first,
          ForwardIterator last);
  1. 对于数组或类似数组的对象,允许自定义比较函数:
void sort(ForwardIterator first,
          ForwardIterator last,
          StrictWeakOrdering comp);

参数说明

  • firstlast 是迭代器,分别指向要排序的序列的起始位置和结束位置(不包括结束位置)。
  • comp 是一个可选的比较函数或函数对象,它接受两个参数并返回一个布尔值,指示第一个参数是否应该排在第二个参数之前。

示例

下面是一个使用 sort 函数对 vector 进行排序的示例:

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

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

    // 使用默认比较,即元素类型的<运算符
    std::sort(numbers.begin(), numbers.end());

    // 打印排序后的vector
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

多样化数据类型和自定义比较

如果容器中的元素是自定义的类或结构体,你需要重载 < 运算符来定义元素的比较逻辑。下面是一个示例:

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

// 定义一个结构体
struct Person {
    std::string name;
    int age;

    // 重载<运算符,用于比较Person对象
    bool operator<(const Person& other) const {
        return age < other.age; // 按年龄排序
    }
};

int main() {
    std::vector<Person> people;
    people.push_back({"Alice", 30});
    people.push_back({"Bob", 25});
    people.push_back({"Charlie", 35});

    // 使用默认比较,因为Person结构体重载了<运算符
    std::sort(people.begin(), people.end());

    // 打印排序后的vector
    for (const auto& person : people) {
        std::cout << person.name << " (" << person.age << ") ";
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,Person 结构体重载了 < 运算符,以便 sort 函数可以根据 age 成员变量对 Person 对象进行排序。如果你需要不同的排序标准,你可以定义一个自定义比较函数或函数对象,并将其作为第三个参数传递给 sort 函数。

如何反向排序?

在C++中,如果你想要进行反向排序,你可以使用标准库中的 greater 函数,或者自定义一个比较函数或函数对象。以下是两种方法的示例:

使用 std::greater

你可以使用 std::greater 来创建一个比较函数,它将比较两个元素并返回它们是否应该反向排序。

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

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

    // 使用std::greater来实现反向排序
    std::sort(numbers.begin(), numbers.end(), std::greater<int>());

    // 打印排序后的vector
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,std::greater<int>() 创建了一个比较函数对象,它将比较两个 int 类型的元素,并返回它们是否应该反向排序。

自定义比较函数

你也可以定义一个自定义比较函数,该函数接受两个参数并返回 true 如果第一个参数应该排在第二个参数之后。

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

// 自定义比较函数
bool reverseCompare(int a, int b) {
    return a > b; // 如果a大于b,返回true,实现反向排序
}

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

    // 使用自定义比较函数进行反向排序
    std::sort(numbers.begin(), numbers.end(), reverseCompare);

    // 打印排序后的vector
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,reverseCompare 函数接受两个 int 类型的参数,并返回 true 如果第一个参数应该排在第二个参数之后,从而实现反向排序。

使用Lambda表达式

你还可以使用Lambda表达式来创建一个简洁的比较函数。

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

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

    // 使用Lambda表达式进行反向排序
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a > b;
    });

    // 打印排序后的vector
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,Lambda表达式 [](int a, int b) { return a > b; } 创建了一个匿名函数对象,它接受两个 int 类型的参数并返回 true 如果第一个参数应该排在第二个参数之后。这种方法在代码中非常简洁,特别是当比较逻辑简单时。


http://www.kler.cn/news/360667.html

相关文章:

  • 【C++】C++多态世界:从基础到前沿
  • SpringCloud-负载均衡-ribbon
  • 【学习笔记】网络流
  • YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题
  • 技术总结(十)
  • LeetCode 203 - 移除链表元素
  • JDBC——(1)
  • 1166 设计文件系统
  • Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解
  • 京东详情 API 接口有什么应用与价值?
  • 【牛客刷题】笔记2
  • 科研类型PPT的制作技巧
  • 昇思MindSpore进阶教程--Running Data Recorder
  • 我对需求分析的理解
  • 解决篡改猴 URL is not permit
  • 移除Microsoft Edge浏览器“由你的组织管理“提示的方法
  • Vue3使用element plus时el-menu导航选中后刷新页面及修改URL无法保持当前选中状态问题
  • Go 语言中格式化动词
  • 深入理解左值和右值:软件工程中的基本概念
  • 复习:react 中的 refs,怎么使用,有哪些使用场景