====== در برگیرنده ها $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 // کتابخانه مورد نیاز map mapName; // map تعریف mapName[key]; // key دسترسی به مقدار مربوط به کلید mapName.find(key) // و در صورت پیدا شدن map در key پیدا کردن عنصر با کلید // برگرداندن اشاره گر به آن و در غیر اینصورت برگرداندن // mapName.end() اشاره گر mapName.size(); // map برگرداندن اندازه mapName.empty(); // خالی است map برگرداندن اینکه mapName.clear(); // map خالی کردن ===== مثال اول ===== با استفاده از پشته میخواهیم برنامه ای بنویسیم که تشخیص دهد یک پرانتز گذاری معتبر است یا نه برای هرکس اندیس جفت آن را بدست آورد. #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<