====== در برگیرنده ها $Containers$ ======
به منظور راحتی برنامه نویسان بسیاری از داده ساختار های پرکاربرد در قالب کلاس های آماده در کتابخانه $STL$ نوشته شده است که در اینجا به معرفی برخی از آن ها میپردازیم.
===== $pair$ =====
این داده ساختار در واقع یک زوج مرتب میباشد که از داده ساختار map تخصیص یافته و در آن عناصر دارای کلید های منحصر به فرد هستند . از زوج مرتب برای ترکیب دو مقدار که ممکن است از نظر نوع متفاوت باشند نیز استفاده می شود.
#include // کتابخانه مورد نیاز
pair pairName; // pair تعریف
piarName = {Value1, Value2}; // pair مقداردهی
pairName.first // دسترسی به عنصر اول
pairName.second // دسترسی به عنصر دوم
===== $vector$ =====
این داده ساختار همچون یک آرایه با سایز متغیر است که امکان دسترسی مستقیم به اعضا و همچنین درج عنصر در انتها و یا حذف آخرین عنصر مهیا است. حال به نحوه تعریف و استفاده از آن میپردازیم
# include // کتابخانه مورد نیاز
vector vectorName; // vector تعریف
vectorName[i]; // ام i دسترسی به عنصر
vectorName.push_back(x); // به انتها x اضافه کردن
vectorName.pop_back(); // vector حذف عنصر انتهای
vectorName.back(); // vector برگرداندن آخرین عضو
vectorName.front(); // vector برگرداندن اولین عضو
vectorName.size(); // vector برگرداندن اندازه
vectorName.empty(); // خالی است vector برگرداندن اینکه
vectorName.clear() // vector خالی کردن
===== $stack$ =====
این داده ساختار در واقع همان داده ساختار پشته است که از قاعده $LIFO(LastInFirstOut)$ پیروی میکند.
# include // کتابخانه مورد نیاز
stack stackName; // تعریف پشته
stackName.push(x); // روی پشته x گذاشتن
stackName.top() // برگرداندن عنصر روی پشته
stackName.pop(); // برداشتن بالاترین عنصر پشته
stackName.size(); // برگرداندن اندازه پشته
stackName.empty(); // برگرداندن اینکه پشته خالی است
===== $queue$ =====
این کلاس همان داده ساختار صف است که از قاعده $FIFO(FirstInFirstOut)$ پیروی میکند.
# include // کتابخانه مورد نیاز
queue queueName; // تعریف صف
queueName.push(x); // انتها صف x گذاشتن
queueName.front() // برگرداندن عنصر ابتدای صف
queueName.pop(); // برداشتن اولین عنصر صف
queueName.size(); // برگرداندن اندازه صف
queueName.empty(); // برگرداندن اینکه صف خالی است
queueName.clear(); // خالی کردن صف
===== $set$ =====
این کلاس داده ساختار درخت دودویی جست جو بهینه است که با الگوریتم $RedBlackTree$ پیاده سازی شده است.
# include // کتابخانه مورد نیاز
set setName; // set تعریف
setName.insert(x); // set به x افزودن
setName.find(x) // و در صورت پیدا شدن set در x پیدا کردن عنصر
// برگرداندن اشاره گر به آن و در غیر اینصورت برگرداندن
// setName.end() اشاره گر
setName.erase(x); // set در صورت وجود از x حذف عنصر
setName.size(); // set برگرداندن اندازه
setName.empty(); // خالی است set برگرداندن اینکه
setName.clear(); // set خالی کردن
===== $map$ =====
این داده ساختار در واقع همچون جدولی میماند که که یک سری کلید را به عنصر مربوطه مرتبط میکند در پیاده سازی آن در واقع از همان $set$ استفاده شده است که عناصر آن زوج مرتبی از کلید و مقدار هستند. توجه کنید که عنصر مربوط به هر کلید یکتاست در نتیجه دو زوج مرتب با مولفه اول یکسان در درخت موجود نیستند.
# include
===== مثال اول =====
با استفاده از پشته میخواهیم برنامه ای بنویسیم که تشخیص دهد یک پرانتز گذاری معتبر است یا نه برای هرکس اندیس جفت آن را بدست آورد.
#include
#include
using namespace std;
const int MAX_N=100*1000;
int match[MAX_N];
string P;
stack S;
bool notBalanced;
int main()
{
cin >> P;
for(int i=0;i<(int)P.size();i++)
{
if(P[i]=='(')
S.push(i);
else{
if(S.empty()){
notBalanced=true;
break;
}
match[i]=S.top();
match[match[i]]=i;
S.pop();
}
}
if(!S.empty())
notBalanced=true;
if(notBalanced)
cout<<"The Input String is not Balanced !";
else
for(int i=0;i<(int)P.size();i++)
cout<
===== مثال 2 =====
در مثال دوم میخواهیم ببنیم که جمع اعضای زیر مجموعه های یک مجموعه حداکثر $20$ عضوی چند عدد متمایز تولید میکنند.
# include
# include
# include
using namespace std;
int N;
vector V;
set S;
int main()
{
cin >> N;
for(int i=0;i> temp;
V.push_back(temp);
}
for(int mask=0;mask<(1<>j)&1)
sum+=V[j];
S.insert(sum);
}
cout<