به منظور راحتی برنامه نویسان بسیاری از داده ساختار های پرکاربرد در قالب کلاس های آماده در کتابخانه $STL$ نوشته شده است که در اینجا به معرفی برخی از آن ها میپردازیم.
این داده ساختار در واقع یک زوج مرتب میباشد که از داده ساختار map تخصیص یافته و در آن عناصر دارای کلید های منحصر به فرد هستند . از زوج مرتب برای ترکیب دو مقدار که ممکن است از نظر نوع متفاوت باشند نیز استفاده می شود.
#include <utility> // کتابخانه مورد نیاز pair<Type1,Type2> pairName; // pair تعریف piarName = {Value1, Value2}; // pair مقداردهی pairName.first // دسترسی به عنصر اول pairName.second // دسترسی به عنصر دوم
این داده ساختار همچون یک آرایه با سایز متغیر است که امکان دسترسی مستقیم به اعضا و همچنین درج عنصر در انتها و یا حذف آخرین عنصر مهیا است. حال به نحوه تعریف و استفاده از آن میپردازیم
# include<vector> // کتابخانه مورد نیاز vector<Type> 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 خالی کردن
این داده ساختار در واقع همان داده ساختار پشته است که از قاعده $LIFO(LastInFirstOut)$ پیروی میکند.
# include<stack> // کتابخانه مورد نیاز stack<Type> stackName; // تعریف پشته stackName.push(x); // روی پشته x گذاشتن stackName.top() // برگرداندن عنصر روی پشته stackName.pop(); // برداشتن بالاترین عنصر پشته stackName.size(); // برگرداندن اندازه پشته stackName.empty(); // برگرداندن اینکه پشته خالی است
این کلاس همان داده ساختار صف است که از قاعده $FIFO(FirstInFirstOut)$ پیروی میکند.
# include<queue> // کتابخانه مورد نیاز queue<Type> queueName; // تعریف صف queueName.push(x); // انتها صف x گذاشتن queueName.front() // برگرداندن عنصر ابتدای صف queueName.pop(); // برداشتن اولین عنصر صف queueName.size(); // برگرداندن اندازه صف queueName.empty(); // برگرداندن اینکه صف خالی است queueName.clear(); // خالی کردن صف
این کلاس داده ساختار درخت دودویی جست جو بهینه است که با الگوریتم $RedBlackTree$ پیاده سازی شده است.
# include<set> // کتابخانه مورد نیاز set<Type> 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 خالی کردن
این داده ساختار در واقع همچون جدولی میماند که که یک سری کلید را به عنصر مربوطه مرتبط میکند در پیاده سازی آن در واقع از همان $set$ استفاده شده است که عناصر آن زوج مرتبی از کلید و مقدار هستند. توجه کنید که عنصر مربوط به هر کلید یکتاست در نتیجه دو زوج مرتب با مولفه اول یکسان در درخت موجود نیستند.
# include<map> // کتابخانه مورد نیاز map<KeyType,ValueType> mapName; // map تعریف mapName[key]; // key دسترسی به مقدار مربوط به کلید mapName.find(key) // و در صورت پیدا شدن map در key پیدا کردن عنصر با کلید // برگرداندن اشاره گر به آن و در غیر اینصورت برگرداندن // mapName.end() اشاره گر mapName.size(); // map برگرداندن اندازه mapName.empty(); // خالی است map برگرداندن اینکه mapName.clear(); // map خالی کردن
با استفاده از پشته میخواهیم برنامه ای بنویسیم که تشخیص دهد یک پرانتز گذاری معتبر است یا نه برای هرکس اندیس جفت آن را بدست آورد.
#include <iostream> #include <stack> using namespace std; const int MAX_N=100*1000; int match[MAX_N]; string P; stack<int> 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<<match[i]+1<<" "; cout<<endl; }
در مثال دوم میخواهیم ببنیم که جمع اعضای زیر مجموعه های یک مجموعه حداکثر $20$ عضوی چند عدد متمایز تولید میکنند.
# include <iostream> # include <vector> # include <set> using namespace std; int N; vector<int> V; set<int> S; int main() { cin >> N; for(int i=0;i<N;i++){ int temp; cin >> temp; V.push_back(temp); } for(int mask=0;mask<(1<<N);mask++){ int sum=0; for(int j=0;j<N;j++) if((mask>>j)&1) sum+=V[j]; S.insert(sum); } cout<<S.size()<<endl; return 0; }