এসটিএল কন্টেইনার (STL Containers)
রান্নাঘরের সাথে তুলনা (The Kitchen Analogy)
সি++-এর স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি বা এসটিএল (STL)-কে মূলত একটি সম্পূর্ণ সজ্জিত বা ফুল্লি ইকুইপড (fully equipped) প্রফেশনাল রান্নাঘরের (professional kitchen) সাথে তুলনা করা যেতে পারে। আপনার কি বিভিন্ন আইটেমের (items) তালিকা বা লিস্ট (list) সংরক্ষণ করার প্রয়োজন? এর জন্য এখানে একটি কন্টেইনার (container) রয়েছে। আপনার কি কি বা key-এর ওপর ভিত্তি করে দ্রুততম সময়ে (fast lookups) কোনো কিছু খুঁজে বের করা প্রয়োজন? এর জন্যও এখানে একটি কন্টেইনার রয়েছে। কিংবা কোনো শিডিউলিংয়ের (scheduling) জন্য আপনার কি একটি প্রায়োরিটি কিউয়ের (priority queue) প্রয়োজন? একদম চিন্তা নেই, এখানে সেটিও আগে থেকেই তৈরি করা (Already built) আছে।
এখানকার আসল কৌশলটি মূলত এর প্রতিটি হাঁড়ি-পাতিল (every pot and pan) সম্পর্কে জানা নয় — বরং এখানকার আসল কাজ হলো উপযুক্ত কাজের জন্য ঠিক কোন জিনিসটিকে বেছে নিতে হবে (which one to grab), সেটি জানা।
সিকোয়েন্স কন্টেইনার (Sequence Containers) — অর্ডারড কালেকশন (Ordered Collections)
এরা মূলত একটি নির্দিষ্ট ক্রমানুসারে (specific order) বিভিন্ন এলিমেন্ট বা উপাদানগুলোকে স্টোর (store) করে বা সংরক্ষণ করে।
vector— ডায়নামিক অ্যারে (Dynamic array)। এটিই হলো যেকোনো কাজের ক্ষেত্রে আপনার প্রথম ও প্রধান ডিফল্ট পছন্দ (default)। এটি দ্রুত র্যান্ডম অ্যাক্সেস (random access) এবং দ্রুত অ্যাপেন্ড (append) করার সুবিধা প্রদান করে।deque— ডাবল-এন্ডেড কিউ বা Double-ended queue। এটি মূলত এর সামনে (front) এবং পেছনে (back) — উভয় দিক থেকেই দ্রুত ইনসার্ট/রিমুভ (insert/remove) করার সুবিধা প্রদান করে।list— ডাবলি-লিঙ্কড লিস্ট (Doubly-linked list)। এটি মূলত যেকোনো জায়গা থেকে দ্রুত ইনসার্ট/রিমুভ (insert/remove) করার সুবিধা প্রদান করে (যদি আপনার কাছে একটি ইটারেটর বা iterator থাকে), তবে এতে কোনো প্রকার র্যান্ডম অ্যাক্সেস (random access) নেই।
অ্যাসোসিয়েটিভ কন্টেইনার (Associative Containers) — কি-নির্ভর লুকআপ (Key-Based Lookup)
map— সাজানো বা সর্টেড (Sorted) কি-ভ্যালু পেয়ার (key-value pairs)। এর লুকআপ টাইম (lookup time) হলো \(O(\log n)\)। এখানকার কি বা keys-গুলো মূলত একটি নির্দিষ্ট ক্রমানুসারে সাজানো (ordered) থাকে।set— সাজানো বা সর্টেড (Sorted) ইউনিক ভ্যালু বা unique values। এটি অনেকটা এমন এক ধরনের ম্যাপের (map) মতো যার কোনো ভ্যালু (values) নেই।unordered_map— হ্যাশ টেবিল (Hash table)। এর গড় লুকআপ টাইম (average lookup time) হলো \(O(1)\)। এর নির্দিষ্ট কোনো অর্ডারিং বা ordering নেই।unordered_set— হ্যাশ সেট (Hash set)। ইউনিক ভ্যালু (unique values), এর নির্দিষ্ট কোনো অর্ডারিং বা ordering নেই।
কন্টেইনার অ্যাডাপ্টার (Container Adapters) — রেস্ট্রিক্টেড ইন্টারফেস (Restricted Interfaces)
stack— লিফো (LIFO)। এটি শুধু এর উপরের (top) অংশ থেকে পুশ/পপ (Push/pop) করে।queue— ফিফো (FIFO)। এটি এর পেছনে (back) পুশ (Push) করে এবং সামনে (front) পপ (pop) করে।priority_queue— এটি সব সময়ই এর সবচেয়ে বড় (largest) (বা সবচেয়ে ছোট) উপাদানটিকেই সবার আগে পপ (pops) করে বের করে আনে।
ম্যাপ বা map — ওয়ার্ড ফ্রিকোয়েন্সি কাউন্টার (Word Frequency Counter)
সেট বা set — ইউনিক এলিমেন্টগুলো (Unique Elements) মূলত অটোমেটিকভাবেই বা Automatically সর্টেড (Sorted) বা সাজানো হয়ে থাকে
আনঅর্ডারড ম্যাপ (unordered_map) বনাম (vs.) ম্যাপ (map) — পারফরম্যান্স (Performance)
প্রায়োরিটি কিউ (priority_queue) — শীর্ষ-K (Top-K) বা সেরা এলিমেন্টগুলো
স্ট্যাক (stack) — ব্র্যাকেট ম্যাচিং (Bracket Matching)
কখন কোনটি ব্যবহার করবেন? (When to Use Which?)
| প্রয়োজনীয়তা (Need) | কন্টেইনার (Container) | কেন? (Why) |
|---|---|---|
| যেকোনো সাধারণ বা জেনারেল-পারপাস লিস্ট (General-purpose list) | vector | ক্যাশ-ফ্রেন্ডলি (Cache-friendly), র্যান্ডম অ্যাক্সেসে দ্রুত (fast random access) |
| সামনে + পেছনে দ্রুত অপারেশন (ops) চালেতে | deque | উভয় দিক (both ends) থেকেই O(1) পুশ/পপ বা push/pop |
| মাঝখানে ঘন ঘন ইনসার্ট/রিমুভের ক্ষেত্রে | list | ইটারেটরের (iterator) সাথে O(1) স্প্লাইস (splice) |
| সর্টেড (Sorted) বা সাজানো কি-ভ্যালু জোড়ার (pairs) ক্ষেত্রে | map | O(log n), অর্ডারড ইটারেশন (ordered iteration) |
| কি-ভ্যালুর দ্রুত লুকআপের (key-value lookup) ক্ষেত্রে | unordered_map | গড় বা average O(1) |
| ইউনিক এবং সাজানো ভ্যালুর ক্ষেত্রে | set | O(log n), অটো-সর্টেড (auto-sorted) |
| LIFO (লিফো) | stack | কেবল ওপর বা top থেকেই পুশ/পপ (Push/pop) করে |
| FIFO (ফিফো) | queue | পেছনে (back) পুশ (Push) করে, সামনে (front) পপ (pop) করে |
| সব সময় যদি সর্বোচ্চ/সর্বনিম্ন মানটির দরকার হয় | priority_queue | হিপ-নির্ভর (Heap-based), O(log n) পুশ/পপ |