如何创建适用于 lambda 表达式的排序函数

How to create a sort function that works with lambda expressions?

本文关键字:表达式 lambda 排序 函数 适用于 何创建 创建      更新时间:2023-10-16

我必须创建一个适用于lambda表达式的排序函数。该函数将被定义为模板。

 template <class T>
 void Sort(std::vector<T> list, int (*Compare)(T &e1, T &e2));

为了对向量进行排序,我必须实现快速排序。我试图解决问题,但我在某个时候得到了库存。当我尝试调用 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 秒的编码时间,并为您节省数天的调试时间。