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

时间:2019-04-14 19:08:45

标签: c++ lambda

我必须创建一个与lambda表达式一起使用的排序函数。该功能将定义为模板。

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

要对向量进行排序,我必须实现quickSort。我试图解决问题,但我当时还是有货。当我尝试调用Sort函数时,编译器告诉我“标识符T未定义”。另外,我不确定应该如何实现quickSort算法。我不知道应该如何递归调用该函数。

#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; });

}

1 个答案:

答案 0 :(得分:0)

赞:

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