如何创建适用于 lambda 表达式的排序函数
How to create a sort function that works with lambda expressions?
我必须创建一个适用于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 秒的编码时间,并为您节省数天的调试时间。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 使用自动推导的 lambda 参数作为常量表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- 不是 lambda 函数中的常量表达式
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式