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

Lambda c++ sortowanie bąbelkowe

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
339 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 (281,310 p.)
zacznij od napisania lambdy...

1 odpowiedź

0 głosów
odpowiedź 18 marca 2022 przez profesorek96 Szeryf (91,400 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ź 686 wizyt
pytanie zadane 18 maja 2015 w C i C++ przez Radfler VIP (101,030 p.)
0 głosów
1 odpowiedź 193 wizyt
pytanie zadane 21 października 2020 w Python przez cba Użytkownik (620 p.)
0 głosów
1 odpowiedź 492 wizyt
pytanie zadane 17 października 2020 w Java przez amtrax Dyskutant (9,630 p.)

93,442 zapytań

142,434 odpowiedzi

322,690 komentarzy

62,804 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

...