• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lambda c++ sortowanie bąbelkowe

VPS Starter Arubacloud
+1 głos
187 wizyt
pytanie zadane 18 marca 2022 w C i C++ przez humus Nowicjusz (160 p.)

Cześć, mam za zadanie zaimplementować funkcję bubble_sort() z użyciem wyrażenia lambda jako parametru funkcji.

Za nic nie mogę zrozumieć jak używać lambdy, przejrzałem wiele stron, ale nigdzie nie ma tego pokazanego bardziej w praktyce.

Tutaj mój kod:

#include <iostream>
#include <vector>

using namespace std;

vector <int> tab;

bool spr(vector<int>& tab)
{
    for(int i=0;i<tab.size()-1;i++)
        if(tab[i]>tab[i+1])
            return false;
    return true;
}
void bubble_sort(vector<int>& tab)
{
    while(spr(tab)==false)
        {
        for(int i=0;i<tab.size()-1;i++)
            if(tab[i]>tab[i+1])
            {
                int temp=tab[i];
                tab[i]=tab[i+1];
                tab[i+1]=temp;
            }
        }
}
void wyswietlanie(vector<int>& tab){
    for(int i=0;i<tab.size();i++)
        cout<<tab[i]<<" ";
    cout<<endl;
}
int main()
{
    int liczba,el;
    liczba=10;
    for(int i=0;i<liczba;i++)
    {
        el=rand()%50;
        tab.push_back(el);
    }
    wyswietlanie(tab);
    bubble_sort(tab);
    wyswietlanie(tab);
    return 0;
}


 

komentarz 18 marca 2022 przez Wiciorny Ekspert (269,120 p.)
zacznij od napisania lambdy...

1 odpowiedź

0 głosów
odpowiedź 18 marca 2022 przez profesorek96 Szeryf (91,420 p.)

Zacznijmy od tego czym są lambdy. Jest to nic innego jak tak zwana funkcja anonimowa. Funkcja taka nie ma nazwy, żyje lokalnie. Lambdy są w C++ od standardu C++11. Pozwalają między innymi na stworzenie obiektu funkcyjnego.

W twoim przypadku powinieneś stworzyć sobie funkcję sortującą bąbelkowo, która to funkcja będzie przyjmować wskaźnik na funkcje. Funkcja ta będzie pozwalała na zmianę kolejności sortowania.

Podobnie działa wbudowana funkcja sort, która przyjmuje 2 lub 3 argumenty. https://en.cppreference.com/w/cpp/algorithm/sort . Jednak nie wchodząc bardziej w szczegóły ostatni argument to właśnie wskaźnik na funkcję. Za pomocą niego możemy decydować jak mają być posortowane elementy. Opcja najprostsza to:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool porownaj(int a,int b)
{
	if(a>b)
	{
		return true;
	}
	return false;
}
bool spr(vector<int>& tab,bool (*por)(int a,int b))
{
    for(int i=0;i<tab.size()-1;i++)
    {
        if(por(tab[i],tab[i+1])==true)
            return false;
    }
    return true;
}
void bubble_sort(vector<int>& tab,bool (*por)(int a,int b))
{
    while(spr(tab,por)==false)
    {
        for(int i=0;i<tab.size()-1;i++)
        {
            if(por(tab[i],tab[i+1])==true)
            {
                swap(tab[i],tab[i+1]);
            }
        }
    }
}
void wyswietlanie(vector<int>& tab){
    for(int i=0;i<tab.size();i++)
        cout<<tab[i]<<" ";
    cout<<endl;
}
int main()
{
    int liczba,el;
    vector <int> tab;
    liczba=10;
    for(int i=0;i<liczba;i++)
    {
        el=rand()%50;
        tab.push_back(el);
    }
    wyswietlanie(tab);
    bubble_sort(tab,porownaj);
    wyswietlanie(tab);
    return 0;
}

Jak widzisz zmodyfikowałem twóją funkcje bubble_sort aby przyjmowała wskaźnik na funkcje porównującą. Bez użycia funkcji anonimowych była konieczność stworzenia gdzieś w kodzie funkcji zwracającej bool oraz przyjmującej dwa argumenty typu int. Możemy jednak ten kod skrócić dzięki funkcjom anonimowym.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool spr(vector<int>& tab,bool (*por)(int a,int b))
{
    for(int i=0;i<tab.size()-1;i++)
    {
        if(por(tab[i],tab[i+1])==true)
            return false;
    }
    return true;
}
void bubble_sort(vector<int>& tab,bool (*por)(int a,int b))
{
    while(spr(tab,por)==false)
    {
        for(int i=0;i<tab.size()-1;i++)
        {
            if(por(tab[i],tab[i+1])==true)
            {
                swap(tab[i],tab[i+1]);
            }
        }
    }
}
void wyswietlanie(vector<int>& tab){
    for(int i=0;i<tab.size();i++)
        cout<<tab[i]<<" ";
    cout<<endl;
}
int main()
{
    int liczba,el;
    vector <int> tab;
    liczba=10;
    for(int i=0;i<liczba;i++)
    {
        el=rand()%50;
        tab.push_back(el);
    }
    wyswietlanie(tab);
    bubble_sort(tab,[](int a,int b){return a>b?true:false;});
    wyswietlanie(tab);
    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 562 wizyt
pytanie zadane 18 maja 2015 w C i C++ przez Radfler VIP (101,030 p.)
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 21 października 2020 w Python przez cba Użytkownik (620 p.)
0 głosów
1 odpowiedź 287 wizyt
pytanie zadane 17 października 2020 w Java przez amtrax Dyskutant (9,630 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...