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

Android常用C++特性之std::sort

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

std::sort 是 C++ 标准库中的一个函数,用于对容器或数组中的元素进行排序。它是一个非常高效的排序算法,通常使用快速排序或混合排序(如 intro sort)实现,具体的实现取决于编译器。

语法

#include <algorithm>template <class RandomIt>
void sort(RandomIt first, RandomIt last);template <class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);

参数

  • first, last:定义要排序范围的迭代器。排序是左闭右开的,即 [first, last)
  • comp(可选):一个自定义的比较函数或对象,用于定义排序规则。

返回值

  • std::sort 没有返回值,但它会对给定范围的元素进行原地排序。

示例

1. 默认排序(升序)
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};// 使用默认的升序排序std::sort(vec.begin(), vec.end());std::cout << "Sorted vector: ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出:

Sorted vector: 1 2 5 5 6 9
2. 自定义排序(降序)
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};// 使用自定义的降序排序std::sort(vec.begin(), vec.end(), std::greater<int>());std::cout << "Sorted vector (descending): ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出:

Sorted vector (descending): 9 6 5 5 2 1
3. 自定义比较函数

你可以提供自己的比较函数或 Lambda 表达式,用于定义排序规则。

#include <iostream>
#include <vector>
#include <algorithm>bool customCompare(int a, int b) {return (a % 10) < (b % 10);  // 比较个位数
}int main() {std::vector<int> vec = {15, 32, 23, 74, 56, 92};// 使用自定义的比较函数std::sort(vec.begin(), vec.end(), customCompare);std::cout << "Sorted vector by last digit: ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出:

Sorted vector by last digit: 32 92 23 74 15 56

4. 排序结构体或类的对象

你可以使用 std::sort 对自定义对象进行排序,并通过自定义比较函数来指定排序条件。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>struct Person {std::string name;int age;
};// 比较函数:按年龄排序
bool compareByAge(const Person& a, const Person& b) {return a.age < b.age;
}int main() {std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};// 按年龄升序排序std::sort(people.begin(), people.end(), compareByAge);std::cout << "People sorted by age: " << std::endl;for (const auto& person : people) {std::cout << person.name << " (" << person.age << ")" << std::endl;}return 0;
}

输出:

People sorted by age: 
Bob (25)
Alice (30)
Charlie (35)

5. 排序部分范围

你可以对一个容器或数组的部分范围进行排序。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};// 只对部分元素进行排序,从第二个到第四个元素(索引从0开始)std::sort(vec.begin() + 1, vec.begin() + 4);std::cout << "Partially sorted vector: ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出:

Partially sorted vector: 5 1 2 9 5 6

注意事项

  • std::sort 只适用于随机访问迭代器(如数组、std::vector)。它不适用于链表(如 std::list),因为链表的迭代器不支持随机访问。
  • std::sort 的时间复杂度为 O(N log N),其中 N 是待排序元素的数量。

总结

  • std::sort 是 C++ 中的高效排序函数,默认使用快速排序或类似算法。
  • 支持默认升序排序和自定义比较规则(如降序、自定义函数等)。
  • 适用于随机访问迭代器,如数组和 std::vector 等容器。

相关文章:

  • Android 安装应用-提交阶段之后剩下的操作
  • 引入Scrum激发研发体系活力
  • 【ArcGIS Pro实操第三期】多模式道路网构建(Multi-model road network construction)原理及实操案例
  • Mac屏蔽系统更新,取出红点标记如果解锁hosts文件
  • css3-----2D转换、动画
  • 【C语言指南】数据类型详解(上)——内置类型
  • 质量技术支持对用户忠诚度的影响
  • Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)
  • CSP-J模拟赛一补题报告
  • 经典文献阅读之--WiROS(用于机器人的WiFi感知工具箱)
  • AutoSar 通信服务架构,CAN通信诊断详解
  • WPS使用越来越卡顿
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL69
  • Vue 3中进行组件开发
  • vue3中< keep-alive >页面实现缓存及遇到的问题
  • 【Linux系统编程】快速查找errno错误码信息
  • Apache Zeppelin在Apache Trafodion上的可视化
  • ERLANG 网工修炼笔记 ---- UDP
  • express + mock 让前后台并行开发
  • IDEA常用插件整理
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • javascript 哈希表
  • passportjs 源码分析
  • vue-router 实现分析
  • Zepto.js源码学习之二
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 回流、重绘及其优化
  • 警报:线上事故之CountDownLatch的威力
  • 开源地图数据可视化库——mapnik
  • 前端面试总结(at, md)
  • 探索 JS 中的模块化
  • 我的业余项目总结
  • 小而合理的前端理论:rscss和rsjs
  • 责任链模式的两种实现
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #php的pecl工具#
  • (1)STL算法之遍历容器
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)逆序输出字符串
  • (done) Go 语言:三种多文件协作方式
  • (Java)【深基9.例1】选举学生会
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (一)面试需要掌握的技巧
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET 设计模式初探
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [<死锁专题>]
  • [000-01-022].第06节:RabbitMQ中的交换机介绍
  • [100天算法】-x 的平方根(day 61)