我必须创建一个与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; });
}
答案 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秒钟的编码时间,并节省您数天的调试时间。