Wyrażenie Lambda

Wyrażenie Lambda
S5
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
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.

Kopiuj
#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ć
edytowany 1x, ostatnio: kq
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
2

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


edytowany 1x, ostatnio: kq
S5
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
0

Zamiast znaku ,,>" ?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
2

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


S5
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
0
Kopiuj
#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 ?

edytowany 1x, ostatnio: sssebastianb5
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
2

Nie ma.

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

Kopiuj
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}
}

edytowany 4x, ostatnio: kq
S5
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:58
0

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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
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.


MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
2

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

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

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Zobacz pozostałe 2 komentarze
nullpt4
funktor raczej obiekt funkcyjny :P nawet nie chodziło mi o C++98, tylko jak teraz lambda w cpp działa pod spodem. Może ławiej było by wytłumaczyć najpierw funckje wyższego rzędu na jakimś pseudokodzie, czy pythonie -> add a b = a + b; calc add = add(2, 4);? ale ten snippet który wkleiłeś też spoko +1 :)
enedil
@nullpt4: jakkolwiek to lubisz bądź nie, takie rzeczy w C++ się nazywa funktorami. W OCamlu funktory to też coś zgoła innego niż w teorii kategorii (są to po prostu moduły parametryzowane typami), też chyba nikt nie ma z tym problemu
LI
LongInteger
@nullpt4: Lambda to ważna funkcjonalność a nie żaden sugar. Pamiętam czasy przed ich wprowadzeniem. STL bez Lambd to był ból d* z ciągłym definiowaniem funktorów przed funkcją na byle pierdołę, tego nie dało się na co dzień używać.
nullpt4
@enedil: tak się je nazywa, ale też widziałem, że ludzie starają się jednak nazywać obiekty funkcyjne poprawnie. W cpp błędnie również ludzie nazwywają auto&& -> uniwersal declaration, gdzie poprawna nazwa to forward declaration i nawet komitet w tej sprawie się wypowiadał :D
nullpt4
@LongInteger: lambda to jest ważna funkcjonalność. Zwróciłem po prostu uwagę, że lambda jest tłumaczona przez kompilator na klase z operatorem (). Koniec końców, syntax lambdy to tak naprawdę syntax sugar na klase z (), IMHO to wcale nie umniejsza przydatności i znaczeniu lambd w cpp, nie chciałem nikogo urazić.
LI
LI
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:98
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):

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.