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

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) 具有相同的结果。

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

相关文章:

  • JS进阶DAY2 构造函数数据常用函数
  • 能效提升超 61%!Fortinet 发布《2024 年可持续发展报告》
  • 精益数据分析(47/126):深挖UGC商业模式的关键要点与指标
  • 5月7号.
  • k8s | Kubernetes 服务暴露:NodePort、Ingress 与 YAML 配置详解
  • 企业级AI革命!私有化部署开源大模型:数据安全+自主可控,打造专属智能引擎
  • 线性代数之矩阵运算:驱动深度学习模型进化的数学引擎
  • Ubuntu安装pgsql
  • 配电站室智能巡检:机器人 VS 固定摄像头,谁更胜一筹?
  • Spark-Core(RDD行动算子)
  • 【PhysUnits】2.2 Scalar<T> 标量元组结构体(scalar/mod.rs)
  • idea左侧项目资源管理器不见了处理
  • bpftrace 中使用 bpf_trace_printk
  • 【MCP】客户端配置(ollama安装、qwen2.5:0.5b模型安装、cherry-studio安装配置)
  • KL散度(Kullback-Leibler Divergence):概率分布差异的量化利器
  • MCP认证全解析:从零到微软认证专家
  • 复刻低成本机械臂 SO-ARM100 上位机控制调试
  • 强化学习之基于无模型的算法之演员-评论家算法
  • 基于供热企业业务梳理的智能化赋能方案
  • 2024ccpc【上海+陕西】
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 游客称在网红雪山勒多曼因峰需救援被开价2.8万,康定文旅:封闭整改
  • 上海杨浦:优秀“博主”购房最高可获200万补贴
  • 泽连斯基称与特朗普通话讨论停火事宜
  • 网民反映“潜水时遭遇服务质量不佳”,三亚开展核查调查
  • 两国战机均未侵入对方领空,巴方公布对印回击细节