首页 > 解决方案 > 如何创建一个适用于 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; });

}

标签: c++lambda

解决方案


像这样:

#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 秒的编码时间,并为您节省数天的调试时间。


推荐阅读