gpt4 book ai didi

c++ - 如何优化自定义日期结构的比较功能?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:57 24 4
gpt4 key购买 nike

我想对 date 的 vector 进行排序,我为它编写了比较函数:

#include <iostream>

struct date {
int day;
int month;
int year;
};

int compare_dates(date a, date b) {
if (a.year < b.year) {
return -1;
} else if (a.year == b.year) {
if (a.month < b.month) {
return -1;
} else if (a.month == b.month) {
if (a.day < b.day) {
return -1;
} else if (a.day > b.day) {
return 1;
}
} else {
return 1;
}
} else {
return 1;
}

return 0;
}

int main() {
date a = {};
date a.day = 19;
date a.month = 11;
date a.year = 2016;

date b = {};
date b.day = 20;
date b.month = 11;
date b.year = 2016;

compare_dates(a, b) // -1
compare_dates(b, a) // 1
compare_dates(b, b) // 0

return 0;
}

它运行良好,但是 compare_dates 函数看起来很糟糕。有什么想法可以改进它吗?

最佳答案

我不是 C++ 专家,其他人指出 std::sort()不需要三向比较,只需要一个< .但是要按照编写的方式清理代码:

你的 compare_dates()继续为 >/</== 做三向比较, 并想要一个 +1/-1/0返回值。所以声明一个三路cmp()帮助函数,就像我们在 Python 中所做的那样。现在你的代码减少到:

int cmp(int x, int y) {
return (x>y) ? 1 : ((x<y) ? -1 : 0);
}

int compare_dates(date a, date b) {
if (cmp(a.year, b.year) != 0)
return cmp(a.year, b.year);

if (cmp(a.month, b.month) != 0)
return cmp(a.month, b.month);

return cmp(a.day, b.day);
}

如果高阶比较给出“==”,您只会陷入低阶比较。这样一来,您就可以避免所有其他子句、大括号和缩进,从而使缩进级别保持不变,并且看起来很容易。它还指出了计算的对称性。

关于c++ - 如何优化自定义日期结构的比较功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40692789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com