c++ - 如何创建一个适用于 lambda 表达式的排序函数?
问题描述
我必须创建一个适用于 lambda 表达式的排序函数。该函数将被定义为模板。
template <class T>
void Sort(std::vector<T> list, int (*Compare)(T &e1, T &e2));
为了对向量进行排序,我必须实现 quickSort。我试图解决这个问题,但我有一点存货。当我尝试调用 Sort 函数时,编译器告诉我“标识符 T 未定义”。另外我不确定我应该如何实现快速排序算法。我不知道我应该如何递归调用该函数。
#include<iostream>
#include <vector>
using namespace std;
template <class T>
void Sort(std::vector<T> list, int(*Compare)(T &e1, T &e2)) {
int i = list.begin(), j = list.right();
T pivot = list[(list.begin() + list.end()) / 2];
while (Compare(list[i], list[j]))
{
while (list[i] < pivot)
i++;
while (list[j] > pivot)
j--;
if (i <= j) {
T tmp = list[i];
list[i] = list[j];
list[j] = tmp;
i++;
j--;
}
}
//Here should be a recursively call
}
int main()
{
std::vector<int> vector = { 5,10,2,4 };
Sort(vector, [](T &e1, T &e2) {return e1 > e2; });
}
解决方案
像这样:
#include<iostream>
#include <vector>
using namespace std;
template <class T, class Compare> // <- Predicate is a function or function-like object
void Sort(std::vector<T> list, Compare comp) // <- deduced
{
int i = list.begin(), j = list.right();
T pivot = list[(list.begin() + list.end()) / 2];
while (comp(list[i], list[j]))
{
while (list[i] < pivot)
i++;
while (list[j] > pivot)
j--;
if (i <= j) {
T tmp = list[i];
list[i] = list[j];
list[j] = tmp;
i++;
j--;
}
}
}
int main()
{
std::vector<int> vector = { 5,10,2,4 };
Sort(vector, [](T &e1, T &e2) {return e1 > e2; });
}
这里有一个很好的例子,在标准库中:
https://en.cppreference.com/w/cpp/algorithm/sort
ps:不要这样做using namespace std;
- 我知道老师喜欢技术,但这是非常糟糕的形式。全局命名空间充满了各种垃圾,具体取决于您在哪个操作系统上编码以及您链接到哪些库。
花时间写出std::vector<T>
等等。这将花费您大约 0.5 秒的编码时间,并为您节省数天的调试时间。
推荐阅读
- python - 如何使用 Pandas 根据值和连续时间段将带时间戳的 CSV 数据拆分为多个 CSV
- python - Numpy随机整数生成器不覆盖整个间隔?
- angular - 为什么 Angular 网站 (irctc.co.in) 要求将 Script WaitForAngularEnabled 设为 false。?没有这个代码是行不通的
- java - 在 API 22 或更低版本上使用带有 Java 8 的 guava Predicate 时应用程序崩溃
- r - 调整ggplot2中的第二个y轴
- c# - DateTime.ParseExact 工作日作为文本抛出 FormatException
- python - 多列的分组并通过考虑每个列的开始和结束为每个列分配值(熊猫)
- python - 为什么 Binary_Cross-entropy Loss 给出负值?
- terraform-provider-azure - 如何使用 terraform 将虚拟网络添加到 api 管理?
- javascript - 转换嵌套对象中的所有值