c++ - 排序向量(冒泡排序)c ++
问题描述
我有 Date 类、bubbleSort、isAfter 和 printVector 函数。所以我的任务是:使用函数 bubbleSort 对向量类型对象 Date 进行排序(使用函数 isAfter 比较日期)。我做了一些事情,但它不起作用,所以任何人都可以帮助我吗?函数冒泡排序(不适用于“日期”,适用于整数、字符串...)。这是我的代码:
//isAfter
template<>
bool isAfter(const Date &first, const Date &second) {
if (first.getYear() == second.getYear()) {
if (first.getMonth() == second.getMonth()) {
if (first.getDay() == second.getDay()) {
cout << first.toString() << " is equal to " << second.toString() << endl;
return false;
} else if (first.getDay() > second.getDay()) {
cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
return true;
} else if (first.getDay() < second.getDay()) {
cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
return true;
}
} else if (first.getMonth() > second.getMonth()) {
cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
return true;
} else if (first.getMonth() < second.getMonth()) {
cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
return true;
}
} else if (first.getYear() > second.getYear()) {
cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
return true;
} else if (first.getYear() < second.getYear()) {
cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
return true;
}
return false;
}
//bubbleSort
template<typename T>
void bubbleSort(vector<T> &vec) {
bool swapp= true;
while (swapp) {
swapp= false;
for (unsigned int i = 0; i < vec.size()- 1; i++) {
if (vec[i] > vec[i + 1]) {
swap(vec[i], vec[i + 1]);
swapp = true;
}
}
}
}
那么如何在bubbleSort中添加isAfter以与“日期”对象一起正常工作?
解决方案
如果这始终是日期的排序顺序并且您控制该类型,则可以为该类型实现比较运算符operator<
、operator>
、operator<=
、operator>=
和。operator==
operator!=
否则,传统的方法是修改您的排序算法以接受operator<
来自其调用者的自定义比较器(按照惯例,具有 的接口,这需要您翻转比较),例如:
template <typename T, typename Compare>
void bubbleSort(vector<T> &vec, Compare compare) {
// as you currently have, but using compare(a, b) instead of a < b
}
template <typename T>
void bubbleSort(vector<T> &vec) {
bubbleSort(vec, std::less<>());
}
然后调用者可以isAfter
这样使用:
bubbleSort(dates, [](const Date& a, const Date& b) { return isAfter(b, a); });
推荐阅读
- sql - 防止 Context.Database.SqlQuery<> 参数发送默认值而不是 null
- react-native - 反应原生视频结束后显示按钮
- laravel - 如何使用 Laravel Sail 配置 Supervisor 和调度?
- javascript - 有什么方法可以将输出 css 合并到 webpack 中的 JS 文件中?
- javascript - 用函数改变状态
- python - Folium 无法使用“相同”图标添加多个点
- mysql - 如何从 2 个表 mysql 中删除数据?
- javascript - 赛普拉斯使用多个包含查找 DOM 元素
- python - numpy - 将 2 个向量与可能缺失的值对齐
- javascript - res.send 和 app.post 有什么区别?