Как создать функцию сортировки, которая работает с лямбда-выражениями? - PullRequest
0 голосов
/ 14 апреля 2019

Мне нужно создать функцию сортировки, которая работает с лямбда-выражениями.Функция будет определена как шаблон.

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

}

1 Ответ

0 голосов
/ 16 апреля 2019

Вот так:

#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 секунды во время написания кода и сэкономит вам дни отладки ада.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...