Wyrażenie Lambda

0

Napisz szablon funkcji sortującej (sam algorytm sortowania nie ma znaczenia, może być to sortowanie bąbelkowe). Szablon powinien otrzymać tablicę typu generycznego oraz funkcję lambda zwracającą wartość logiczną określającą porządek dla elementów tablicy typu generycznego.

#include<iostream>
#include<cstdlib>
using namespace std;

template <typename T>
T sortowanie_babelkowe(T tab[])
{
    
	for(int i=0;i<5;i++)
		for(int j=1;j<5-i;j++) 
		if(tab[j-1]>tab[j])
			swap(tab[j-1], tab[j]);
}



  • mam problem co dalej zrobić
2

Przyjmij lambdę i jej użyj do porównania zamiast >

0

Zamiast znaku ,,>" ?

2

Zamiast operatora >, tak. Masz użyć przekazanej lambdy do ustalenia porządku elementów.

0
#include<iostream>
#include<cstdlib>
using namespace std;

template <typename T>
T sortowanie_babelkowe(T *tab)
{
    auto fun = [tab] (T y) {
	for(int i=0;i<5;i++)
		for(int j=1;j<5-i;j++)
		if(tab[j-1]>tab[j])
		
			swap(tab[j-1], tab[j]);
	
		};
	
}


czy to ma sens na razie ?

2

Nie ma.

Jak nie wiesz o co chodzi, to masz tu przykład wywołania i oczekiwanego rezultatu:

int main()
{
    int tab[] = {1,2,3,4,5};
    auto comp = [](int l, int r) {
        if(l % 2 != r % 2)
            return l % 2 == 0;
        return l < r;
    };
    sortowanie_babelkowe(tab, comp);
    // tab == {2,4,1,3,5}
}
0

Czyli piszę funkcję sortowanie_babelkowe , w niej tworzę lambdę , w lambdzie tworzę pętle tak ?

3

Nie. Piszesz funkcję sortowanie_babelkowe (albo inne), przyjmujesz tablicę i lambdę. Tablicę sortujesz, a do porównania elementów używasz lambdy zamiast operatora >, którego użyłeś wcześniej. Przykład jak ma zostać użyta funkcja sortowanie_babelkowe masz w moim poprzednim poście.

2

Może lambda jest dla ciebie za dziwna do zrozumienia?
Lambda jest bardziej zaawansowaną wersją wskaźnika na funkcję.

template <typename T>
typedef bool (*sortComparator)(const T& left, const T& right);


template <typename T>
void sortowanie_babelkowe(T *tab, size_t size, sortComparator<T> comp)
{
 .. ...... 
     if (comp(tab[j-1], tab[j])) {
            swap(tab[j-1], tab[j]);
     }
}
0
sssebastianb5 napisał(a):

Czyli piszę funkcję sortowanie_babelkowe , w niej tworzę lambdę , w lambdzie tworzę pętle tak ?

Lambda, choć jest funkcją, może być zapamiętana w zmiennej i przekazana przez parametr. Nawet można to nazwać programowanie funkcyjnym, jak ktoś chce.
Tak dla przykładu (podkradzione z neta):

std::function<int()> myFunction = []() { return 0; }
myFunction(); // Returns 0;

1 użytkowników online, w tym zalogowanych: 0, gości: 1