همانند دربرگیرنده ها در کتابخانه STL تعدادی از الگوریتم های پرکابرد نوشته شده است. برای استفاده از آن ها ابتدا باید کتابخانه زیر را include کنید.
#include <algorithm>
حال به بررسی برخی از آنان میپردازیم
با استفاده از این تابع میتوانیم عناصر یک آرایه یا یک vector را مرتب کنیم. توجه کنید که برای اینکه بتوان آن ها را مرتب کرد نیاز است که کوچکتر بودن برای آن type تعریف شده باشد. برای type های پیشفرض این رابطه تعریف شده است. همچنین میتوان از تابعی دلخواه برای مقایسه استفاده کرد که آن را باید به عنوان پارامتر سوم بدهیم.
sort(startPointer,endPointer) // endPointer is not included sort(startPointer,endPointer,compareFunction)
توجه کنید که خود endPointer شامل بازه مرتب سازی نمیشود. به عنوان مثال :
int A[10]; vector<int> V; sort(A+2,A+5); // sorts the element number 2 to element number 4 (2 and 4 included) sort(V.begin(),V.end()) // sorts All of Vector v
حال فرض کنید میخواهیم تابعی بنویسیم که به وسیله عناصر را صعودی مرتب کنیم :
bool cmp(int a,int b){ return (a>b); } sort(V.begin(),V.end(),cmp);
این تابع یک بازه از آرایه یا vector را با مقدار داده شده پر میکند. معمولا برای 0 کردن یا مقدار اولیه دادن به آرایه یا vector کاربرد دارد.
// Format fill(startPointer,endPointer,value); // Example fill(A,A+n,0);
این تابع یک بازه از آرایه یا vector را برعکس میکند.
// Format reverse(startPointer,endPointer); // Example reverse(S.begin(),S.end());
این تابع روی یک بازه مرتب شده اعمال شده و عناصر آن را unique میکند یعنی از هر عنصر یکی را نگه داشته و باقی تکرار هارا در انتها میگذارد و اشاره گر به انتهای عناصر یکتا را بازمیگردند. توجه کنید که عنصری که این اشاره گر به آن اشاره میکند اولین عنصر بعد از بازه یکتا شده است.
// Format unique(startPointer,endPointer); // Example vector<int> v; sort(v.begin(),v.end()); v.resize(unique(v.begin(),v.end())-v.begin());
با استفاده ازین تابع میتوانید روی یک بازه sort شده binarysearch انجام داده و به دنبال مکان یک مقدار خاص بگردید.
// Format lower_bound(startPointer,endPointer,value); upper_bound(startPointer,endPointer,value); // Example lower_bound(v.begin(),v.end(),2);
با استفاده از این تابع میتوانید جایگشت بعدی یا قبلی یک بازه را حساب کنید. این تابع یک مقدار boolean برمیگرداند که در صورتی که برای nextPermutation روی بزرگترین جایگشت اعمال شود false و در غیر اینصورت true است و برای prevPermutation در صورتی که روی کوچکترین جایگشت اعمال شود false و در غیر ایصورت true است.
// Format next_permutation(startPointer,endPointer); prev_permutation(startPointer,endPointer);
میخواهیم برنامه ای بنویسیم که تمام جایگشت ها 1,2,...n را چاپ کند
#include <iostream> #include <algorithm> #include <vector> using namespace std; const int MAX_N=100*1000; void show(const vector<int>& V){ for(int i=0;i<(int)V.size();i++) cout<<V[i]<<" "; cout<<endl; } vector<int> P; int main() { int n; cin >> n; for(int i=1;i<=n;i++) P.push_back(i); sort(P.begin(),P.end()); // not needed here but remember to do it ! do{ show(P); }while(next_permutation(P.begin(),P.end())); return 0; }