شما فرض کن یک تابع داری که برای مرتب سازی نوشتی
میدونی که مرتب سازی رو به هر شکلی میشه تفسیر کرد مثلا از کوچیک به بزرگ - از بزرگ به کوچیک - 1 در میون و ...
مثلا مرتب سازی حبابی رو در نظر بگیرید :
void bubble_sort1(int *a,int size_)//nozooli
{
for(int i=0;i<size_;i++)
{
for(int j=0;j<size_-1;j++)
{
if(a[j]<a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void bubble_sort2(int *a,int size_)//soodi
{
for(int i=0;i<size_;i++)
{
for(int j=0;j<size_-1;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
//توابع بیشتر !...
الان ما برای صعودی و نزولی یک کد نوشتیم فقط فرقشون اینه که شرط if فرق می کنه حالا اگر به هر دلیلی داخل یکی از این توابع اشتباه کرده باشیم مجبوریم که هر n تا تابع رو عوض کنیم و این که اگر قرار باشه همین مرتب سازی رو به یک شکل دیگه انجام بدیم کد قابل استفاده مجدد نیست و باید یک تابع دیگه رو دوباره مجددا بنویسیم (دلایلی که کد تکراری خوب نیست)
توی c و c++ برای این که این جور مواقع کد بهتری بنویسیم از function pointer استفاده می کنن
به جای n تا تابع بالا یک تابع می نویسیم به این شکل :
void bubble_sort(int *a,int size_,bool (*comp)(int a,int b))
{
for(int i=0;i<size_;i++)
{
for(int j=0;j<size_-1;j++)
{
if(comp(a[j],a[j+1]))
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
و زمان استفاده نحوه چک کردن رو خودمون به تابع اعلام می کنیم :
#include <iostream>
using namespace std;
void bubble_sort(int *a,int size_,bool (*comp)(int a,int b))
{
for(int i=0;i<size_;i++)
{
for(int j=0;j<size_-1;j++)
{
if(comp(a[j],a[j+1]))
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
bool compare1(int a,int b){
return a<b;
}
bool compare2(int a,int b){
return a>b;
}
int main()
{
int a[5]={6,2,7,1,3};
bubble_sort(a,5,compare1);
for(auto i:a)
cout<<i<<"\n";
cout<<"____\n\n";
bubble_sort(a,5,compare2);
for(auto i:a)
cout<<i<<"\n";
}
از c++11 به بعد میشه به جای تعریف تابع بصورت جدا از lambda هم استفاده کرد :
مثلا :
bubble_sort(a,5,[](int a,int b){return a<b;});
الان تابع بالا رو یکبار نوشتیم و به حالت های متفاوتی ازش میشه استفاده کرد .
البته هنوز تابع مرتب سازی ما یک مشکل دیگه هم داره این که فقط برای آرایه از نوع int کار می کنه برای این که برای انواع داده متفاوت کار کنه از template میشه استفاده کرد یا مثل std::sort در c++ از iterator ها کمک گرفت .