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

在C++中正确处理日期字符串排序的方法

在C++编程中,排序是一个核心任务。std::sort(来自<algorithm>)是一个极其强大的“神奇黑盒”,可以为你排序vector

  • vector<int> nums = {50, 10, 30};
  • std::sort(nums.begin(), nums.end());->nums变成{10, 30, 50}(从小到大)。
  • vector<string> names = {"Charlie", "Alice"};
  • std::sort(names.begin(), names.end());->names变成{"Alice", "Charlie"}(按字母顺序)。

但是,如果你有一堆“日期”字符串呢?
vector<string> dates = {"10-12-2023", "05-01-2024"};

如果你“天真地”调用std::sort
std::sort(dates.begin(), dates.end());

  • 结果会是:{"05-01-2024", "10-12-2023"}
  • 这是错误的!2024年的日期排在了2023年的前面

一个简单的比喻:“字典” vs “日历”

  • 默认std::sort(用于字符串):就像一个“字典”。它懂“字母顺序”。在“字典”里,"0"(以 ‘0’ 开头)确实排在"1"(以 ‘1’ 开头) 的前面
  • 你想要的(日期排序):就像一个“日历”。你需要一种“智能”排序,它能理解Year(年),Month(月),Day(日) 的逻辑关系

解决方案:
我们不能直接排序字符串。我们必须:

  1. “教会” C++ 如何“阅读”日期。最好的方法是创建一个“自定义盒子”(struct),把日期拆分成“年”、“月”、“日”三个整数。
  2. “教会”std::sort我们的“日历规则”。我们必须提供一个“自定义比较器”(Comparator)函数,告诉std::sort:“先比较年份,如果年份相同,再比较月份…

在本教程中,你将学会:

  • 为什么不能直接排日期字符串(“字典” vs “日历”)。
  • 如何使用struct来“打包”日期数据 (Y, M, D)。
  • “黄金法则”:如何编写一个“自定义比较器”函数 (Comparator)。
  • std::sort的“第三个参数”:如何把你的“规则”传递给std::sort
  • 实战演练:编写一个完整的sortDates程序。
  • “X光透 视”:用调试器“亲眼目睹”std::sort是如何“调用”你的“自定义规则”的。

前置知识说明 (100% 自洽):

  • 变量 (Variable):理解存储数据的“盒子”,如int year = 2024;
  • vector(向量):C++标准库提供的一种“动态数组”(“魔法弹性盒子列表”)。你需要#include <vector>
  • struct(结构体):一种“蓝图”,用于创建“自定义盒子”,把相关数据(如y,m,d)打包在一起。
  • #include <algorithm>std::sort“神奇黑盒”所在的“工具包”。
  • bool函数:一个返回true(真) 或false(假) 的函数,我们将用它来编写“规则”。
  • if/else if/else:用于编写“规则”的逻辑判断。
  • 编译 (Compile):C++代码(“食谱”)必须被“编译”(“烘焙”),才能变成电脑可执行的程序(“蛋糕”)。

第一部分:“自定义盒子”——Date结构体

首先,我们“设计”一个“蓝图”,告诉C++一个Date对象长什么样。

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

#include <vector>

#include <algorithm> // 包含 std::sort

#include <string>

usingnamespacestd;

// “蓝图”:一个自定义的 Date 盒子

// 它把日期“拆分”成三个 *可比较* 的整数

structDate {

intday;

intmonth;

intyear;

};

现在,我们可以创建Date对象的vector,而不是stringvector
vector<Date> calendar = { {10, 12, 2023}, {5, 1, 2024}, {15, 12, 2023} };

第二部分:“日历规则”——自定义比较器

std::sort的“默认规则”是operator<(小于号)。我们现在要提供一个的“规则手册”(一个函数),来代替<

比较器 (Comparator) 的“黄金法则”:
std::sort需要一个函数bool compare(A, B)

  • 如果你希望A排在B前面,你的函数必须返回true
  • 如果你希望A排在B后面(或相同),你的函数必须返回false

compareDates.cpp(“日历规则”函数)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// “规则手册”:告诉 std::sort 如何比较两个 Date 对象

boolcompareDates(constDate& a,constDate& b) {

// 规则 1:先比较“年”

if(a.year < b.year) {

returntrue;// a 的年份小,a 应该排在前面

}

if(a.year > b.year) {

returnfalse;// a 的年份大,a 应该排在后面

}

// “行内预警”:如果程序运行到这里,说明 a.year == b.year

// 规则 2:如果年份相同,再比较“月”

if(a.month < b.month) {

returntrue;// a 的月份小,a 应该排在前面

}

if(a.month > b.month) {

returnfalse;// a 的月份大,a 应该排在后面

}

// “行内预警”:如果程序运行到这里,说明年份和月份都相同

// 规则 3:如果月份相同,最后比较“日”

return(a.day < b.day);// 如果 a.day 小,返回 true

}

第三部分:“实战演练”——结合sort与“规则”

现在我们把std::sort和我们的“规则手册”compareDates结合起来。

date_sort.cpp(完整代码)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

#include <iostream>

#include <vector>

#include <algorithm>

#include <string>

usingnamespacestd;

// --- 1. “蓝图” ---

structDate {

intday;

intmonth;

intyear;

};

// --- 2. “规则手册” ---

boolcompareDates(constDate& a,constDate& b) {

if(a.year < b.year)returntrue;

if(a.year > b.year)returnfalse;

// 年份相同

if(a.month < b.month)returntrue;

if(a.month > b.month)returnfalse;

// 月份也相同

return(a.day < b.day);

}

// 辅助函数:打印日期

voidprintDates(conststring& title,constvector<Date>& dates) {

cout << title << endl;

for(constauto& d : dates) {

// (为了美观,我们补 0)

printf(" %02d-%02d-%04d\n", d.day, d.month, d.year);

}

}

intmain() {

// 3. 创建“自定义盒子”列表

vector<Date> calendar = {

{10, 12, 2023},// 10-Dec-2023

{5, 1, 2024},// 05-Jan-2024

{15, 12, 2023},// 15-Dec-2023

{2, 2, 2023}// 02-Feb-2023

};

printDates("--- 原始顺序 ---", calendar);

// 4. “按下按钮”并“递上纸条” (规则手册)

std::sort(calendar.begin(), calendar.end(), compareDates);

printDates("\n--- 日历排序后 ---", calendar);

return0;

}

“手把手”终端模拟:

1

2

3

4

5

6

7

8

9

10

11

12

13

PS C:\MyCode> g++ date_sort.cpp -o date_sort.exe -std=c++11

PS C:\MyCode> .\date_sort.exe

--- 原始顺序 ---

10-12-2023

05-01-2024

15-12-2023

02-02-2023

--- 日历排序后 ---

02-02-2023

10-12-2023

15-12-2023

05-01-2024

顿悟时刻:排序成功std::sort正确地理解了我们的“日历规则”,将 2023 年的日期排在了 2024 年的前面。

第四部分:“X光透 视”——亲眼目睹“规则”被调用

我们无法(也不需要)用调试器“步入” (F11)std::sort内部,因为它是一个高度优化的、编译好的“黑盒”。
但是,我们可以“步入”它调用我们的“自定义规则” (compareDates)!


http://www.jsqmd.com/news/884662/

相关文章:

  • 搭建自动化内容生成流水线并利用Taotoken统一调度AI模型
  • 工业洗地机什么牌子好用?从需求出发选对设备 - 品牌排行榜
  • 如何实现智能AutoCAD字体管理:FontCenter免费解决方案完整指南
  • 3大突破性功能:用HiveWE革新你的魔兽争霸III地图创作体验
  • 原子尺度机器学习互操作性:metatensor与metatomic重塑计算化学工作流
  • 5.25中山黄金回收,哪家靠谱?附门店推荐 - 资讯纵览
  • C++ 标准库中的reverse 函数使用示例
  • 国产大模型新王登基?Qwen3.7-Max全球第五、编程Agent登顶,千问APP免费体验全攻略
  • 如何用douyin-downloader轻松实现抖音内容批量下载与整理
  • AI搜索正在“点名”推荐旅行社,这个GEO案例太猛了 - 品牌背书
  • QTcp网络通信
  • 终极指南:如何用WarcraftHelper让魔兽争霸3在现代电脑上焕发新生 [特殊字符]
  • 模式分层预测驱动推断:处理复杂缺失数据的统计新框架
  • 抖音下载效率革命:douyin-downloader批量下载解决方案
  • 网易云音乐还能这样玩?5分钟解锁插件生态,彻底告别单调播放器
  • 独立开发者如何利用 Taotoken 多模型能力低成本构建 AI 应用原型
  • 自然语言处理的实战项目:从0到1搭建属于自己的文本分类系统
  • 熟食摊创业卖烤鸭必备:靠谱烤鸭成品料厂家电话推荐 - 品牌2025
  • 哪款台灯护眼效果最好孩子用?实测口碑爆款护眼灯品牌,买前必看
  • 华为软挑实战:用双向A*算法搞定200x200网格地图寻路(附C++/Python/Matlab代码)
  • D2DX如何让暗黑破坏神2在4K显示器上流畅运行:5个关键技术解析
  • 连锁不平衡分析终极指南:如何用LDBlockShow快速生成专业级基因组可视化图表
  • 2026年蚌埠滨湖蓝湾附近中介推荐榜--靠谱(排名前十) - 资讯纵览
  • 2001-2025年A股上市公司分行业分地区主营业务构成
  • 浮动布局的自动换行机制
  • ncmdumpGUI终极指南:深度解析网易云音乐NCM加密文件转换技术
  • Fiddler手机断网真相:TLS握手与证书固定的协议级拦截
  • 绩效评估方法
  • 江浙沪名酒回收优质商家推荐:实体门店护航,诚信透明交易 - 资讯纵览
  • 【第四十一周】VLN