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

C++ std::sort 函数

在 C++ 里,std::sort 函数的第三个参数是一个比较函数或者可调用对象,用于定义元素的排序规则。以下为你详细介绍几种常见的传入形式:

1. 普通函数

普通函数可以当作比较函数传入 std::sort。此函数要接收两个同类型的参数,并且返回一个布尔值,用于表明第一个参数是否应该排在第二个参数之前。

#include <iostream>
#include <vector>
#include <algorithm>// 普通比较函数
bool compare(int a, int b) {return a < b;
}int main() {std::vector<int> numbers = {5, 2, 8, 1, 9};std::sort(numbers.begin(), numbers.end(), compare);for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

2. Lambda 表达式

Lambda 表达式是一种匿名函数,能方便地在 std::sort 中定义比较规则。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {5, 2, 8, 1, 9};std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a < b;});for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

3. 函数对象(Functor)

函数对象是实现了 operator() 的类或者结构体实例。借助函数对象,能够在比较过程中保存状态。

#include <iostream>
#include <vector>
#include <algorithm>// 函数对象 升序 (a>b为降序)
struct Compare {bool operator()(int a, int b) const {return a < b;}
};int main() {std::vector<int> numbers = {5, 2, 8, 1, 9};// Compare comp;// std::sort(numbers.begin(), numbers.end(), comp);std::sort(numbers.begin(), numbers.end(), Compare());for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

4. 类的静态成员函数

类的静态成员函数不依赖于类的实例,没有 this 指针,能够直接作为比较函数传入 std::sort

#include <iostream>
#include <vector>
#include <algorithm>class MyClass {
public:static bool compare(int a, int b) {return a < b;}
};int main() {std::vector<int> numbers = {5, 2, 8, 1, 9};std::sort(numbers.begin(), numbers.end(), MyClass::compare);for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

注意事项

  • 比较函数或者可调用对象必须满足严格弱序的要求,即对于任意元素 abc,需要满足以下条件:
    • compare(a, a) 始终为 false
    • compare(a, b)true,则 compare(b, a)false
    • compare(a, b)truecompare(b, c)true,则 compare(a, c)true
    • !compare(a, b)!compare(b, a),则对于任意 ccompare(a, c)compare(b, c) 具有相同的结果。

这些规则保证了排序的正确性和稳定性。

http://www.xdnf.cn/news/4372.html

相关文章:

  • JC/T 2187-2013 铝波纹芯复合铝板检测
  • 【MySQL】C语言访问数据库
  • 第5讲、Transformer 编码器(Encoder)处理过程详解
  • 世界无人机大会将至,大势智慧以“AI+实景三维”赋能低空经济
  • 从创意到变现:独立创造者的破局之路——解码《Make:独立创造者手册》
  • PyCharm连接WSL2搭建的Python开发环境
  • Kepware 连接Modbus TCP/IP
  • 上海雏鸟科技再赴越南,助力10518架无人机刷新吉尼斯记录
  • MySQL优化-MySQL常见的锁机制
  • 报表的那些事:四部演进史——架构视角下的技术跃迁与实战思考
  • 高防ip是怎么做到分布式防御的
  • 如何用命令行判断一个exe是不是c#wpf开发的
  • win11指定Microsoft Print To PDF的输出路径(电子书djvu转pdf输出路径)
  • dify 部署后docker 配置文件修改
  • docker host模式问题
  • 使用Milvus向量数据库构建具有长期记忆的对话机器人
  • Flowchart 流程图的基本用法
  • 基于OpenTelemetry的分布式链路追踪Trace‌实现(PHP篇)
  • androidStudio里gradle过滤冲突资源文件
  • 【解决方案】CloudFront VPC Origins 实践流程深入解析 —— 安全高效架构的实战之道
  • Android 如何理解 Java JNI 中的引用与 Java 对象的区别
  • Kafka Controller的作用是什么?故障时如何恢复? (管理分区和副本状态;通过ZooKeeper选举新Controller)
  • Linux系统Shell脚本之shell函数
  • Kafka的核心组件有哪些?简要说明其作用。 (Producer、Consumer、Broker、Topic、Partition、ZooKeeper)
  • java多线程------synchronized
  • CVE体系若消亡将如何影响网络安全防御格局
  • git合并分支后回滚,再次合并导致更改没有合并的问题
  • CentOS 7 基础环境安装脚本
  • Milvus(16):索引解释
  • 【前端基础】6、CSS的文本属性(text相关)