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