Processing math: 100%

فهرست مندرجات

الگوریتم ها

همانند دربرگیرنده ها در کتابخانه STL تعدادی از الگوریتم های پرکابرد نوشته شده است. برای استفاده از آن ها ابتدا باید کتابخانه زیر را include کنید.

#include <algorithm>

حال به بررسی برخی از آنان میپردازیم

sort

با استفاده از این تابع میتوانیم عناصر یک آرایه یا یک 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);

fill

این تابع یک بازه از آرایه یا vector را با مقدار داده شده پر میکند. معمولا برای 0 کردن یا مقدار اولیه دادن به آرایه یا vector کاربرد دارد.

// Format
fill(startPointer,endPointer,value);
// Example
fill(A,A+n,0);

reverse

این تابع یک بازه از آرایه یا vector را برعکس میکند.

// Format
reverse(startPointer,endPointer);
// Example
reverse(S.begin(),S.end());

unique

این تابع روی یک بازه مرتب شده اعمال شده و عناصر آن را unique میکند یعنی از هر عنصر یکی را نگه داشته و باقی تکرار هارا در انتها میگذارد و اشاره گر به انتهای عناصر یکتا را بازمیگردند. توجه کنید که عنصری که این اشاره گر به آن اشاره میکند اولین عنصر بعد از بازه یکتا شده است.

// Format
unique(startPointer,endPointer);
// Example
vector<int> v;
sort(v.begin(),v.end());
v.resize(unique(v.begin(),v.end())-v.begin());

bound lower/upper

با استفاده ازین تابع میتوانید روی یک بازه sort شده binarysearch انجام داده و به دنبال مکان یک مقدار خاص بگردید.

// Format
lower_bound(startPointer,endPointer,value);
upper_bound(startPointer,endPointer,value);
// Example
lower_bound(v.begin(),v.end(),2);

permutation next/prev

با استفاده از این تابع میتوانید جایگشت بعدی یا قبلی یک بازه را حساب کنید. این تابع یک مقدار boolean برمیگرداند که در صورتی که برای nextPermutation روی بزرگترین جایگشت اعمال شود false و در غیر اینصورت true است و برای prevPermutation در صورتی که روی کوچکترین جایگشت اعمال شود false و در غیر ایصورت true است.

// Format
next_permutation(startPointer,endPointer);
prev_permutation(startPointer,endPointer);

مثال

میخواهیم برنامه ای بنویسیم که تمام جایگشت ها 1,2,...n را چاپ کند

permuation.cpp
#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;
}