লুপ (Loops)
লুপ ফ্যামিলি বা লুপ পরিবার (The Loop Family)
যেকোনো প্রোগ্রামিংয়ের ক্ষেত্রেই লুপগুলোকে (Loops) মূলত এর ওয়ার্কহর্স বা অশ্বশক্তি (workhorses) বলা হয় — এরা মূলত কোনো একটি ব্লক বা কোডকে (block of code) ততক্ষণ পর্যন্ত রিপিট (repeat) করে বা পুনরাবৃত্তি করে, যতক্ষণ না পর্যন্ত এর ভেতরের কোনো একটি শর্ত পূরণ (condition is met) হচ্ছে। সি++ (C++) মূলত সি (C) থেকে উত্তরাধিকারসূত্রে পাওয়া এর তিনটি ক্লাসিক লুপ (classic loop) ফর্মকেই (for, while, do-while) গ্রহণ করেছে এবং এর সাথে আধুনিক যুগের এক সুপারস্টার বা নতুন বৈশিষ্ট্যকেও (modern superstar) যুক্ত করেছে: আর তা হলো এখানকার রেঞ্জ-বেসড ফর লুপ (range-based for loop)।
যদি এই ক্লাসিক ফর লুপটিকে (classic for loop) একটি ম্যানুয়াল ট্রান্সমিশনের (manual transmission) গাড়ির সাথে তুলনা করা হয় — যা অত্যন্ত শক্তিশালী (powerful) হলেও এর প্রতিটি গিয়ার আপনাকেই ঠিকমতো বদলাতে (gear shift) হয় — তবে এই রেঞ্জ-বেসড ফর লুপটি (range-based for) হলো অনেকটা একটি অটোমেটিক ট্রান্সমিশনের (automatic transmission) মতো। গন্তব্য একই (Same destination), তবে এতে প্যারা অনেক কম (less fiddling)।
ক্লাসিক ফর লুপ (The Classic for Loop)
while এবং do-while
এই while মূলত এর প্রতিটি ইটারেশন বা চক্রের আগেই (before) এর শর্তটি (condition) চেক (checks) করে — যদি শর্তটি একেবারে শুরুতেই ফলস (false) বা মিথ্যা হয়ে যায়, তবে এর ভেতরের বডিটি (body) আর কখনোই রান (runs) করে না। কিন্তু do-while মূলত এটি পরে (after) চেক করে — আর এই কারণে এর বডিটি (body) সব সময়ই অন্ততপক্ষে একবারের (at least once) জন্য হলেও রান করে।
এই do-while মূলত বিভিন্ন মেনু (menus) তৈরির জন্য একেবারে পারফেক্ট (perfect): কারণ ব্যবহারকারীকে বা user-কে সে আরও এগিয়ে (continue) যেতে চায় কি না তা জিজ্ঞেস করার আগে, আপনি সব সময়ই তাকে একবারের জন্য হলেও এর মেনুটি (menu) দেখাতে চাইবেন।
while এবং do-while
রেঞ্জ বেসড ফর লুপ (Range-Based for) — এখানকার মূল আকর্ষণ (The Star of the Show)
সি++১১ (C++11)-এ যুক্ত হওয়া এই রেঞ্জ-বেসড ফর লুপটি (range-based for loop) হলো যেকোনো কালেকশনের (collections) ওপর ইটারেট (iterate) করার জন্য সবচেয়ে আধুনিক (modern) একটি উপায়। এতে কোনো ধরনের ইনডেক্স ম্যানেজমেন্ট (index management), বিভিন্ন অফ-বাই-ওয়ান এরর (off-by-one errors) বা কোনো ইটারেটর বয়লারপ্লেটেরও (iterator boilerplate) প্রয়োজন পড়ে না। শুধু সি++ (C++)-কে বলে দিলেই হয় যে এটি ঠিক কোন জিনিসের ওপর লুপ (loop) তৈরি করবে, এরপর বাকি সবকিছুই এটি নিজেই সামলে (handles the rest) নেয়।
এর সাধারণ নিয়ম বা সিনট্যাক্সটি (syntax) হলো: for (auto& element : collection)
এটিকে আপনি অনেকটা এমনভাবে চিন্তা করতে পারেন যেন আপনি বলছেন: "এই কালেকশনের ভেতরের প্রতিটি এলিমেন্টের জন্য (for each element in this collection), এই কাজগুলো করো (do something)।"
ভেক্টরগুলোর সাথে রেঞ্জ-বেসড ফর লুপ (Range-Based for)
& ব্যবহার করুন: যেমন for (auto& x : vec)। & ছাড়া এটি আপনাকে প্রতিটি এলিমেন্টের শুধুমাত্র একটি অনুলিপি বা কপি (copy) প্রদান করে — এক্ষেত্রে আপনি যদি এর কোনো কিছু পরিবর্তন (modifications) করেন তবে তা আপনার মূল ফাইলের (original) ওপর কোনো প্রভাব ফেলবে না, এবং প্রতিটি এলিমেন্টকে (every element) কপি করতে গিয়ে আপনাকে শুধু শুধু অতিরিক্ত একটি পারফরম্যান্স খরচও (performance cost) দিতে হবে। তাই যখন আপনাকে শুধুমাত্র ডেটা পড়ার (read) প্রয়োজন হয় তখন const auto& ব্যবহার করুন এবং যখন আপনাকে ডেটা পরিবর্তন করার বা মডিফাইয়ের (modify) প্রয়োজন হয় তখন auto& ব্যবহার করুন।সি++১৭ (C++17): লুপগুলোর ক্ষেত্রে স্ট্রাকচারড বাইন্ডিং (Structured Bindings in Loops)
যেকোনো map-এর ওপর ইটারেট (iterating) করে চলার সময় এর প্রতিটি এলিমেন্টই (element) মূলত .first (কি বা key) এবং .second (ভ্যালু বা value)-এর pair বা জোড়া হিসেবে কাজ করে। সি++১৭-এর (C++17) আগে এটি লিখতে গেলে অত্যন্ত বিদঘুটে বা ক্লাঙ্কি (clunky) দেখাতো। কিন্তু এই স্ট্রাকচারড বাইন্ডিং-এর (structured bindings) সাহায্যে আপনি এখন চাইলেই ওই লুপের ঠিক হেডার বা হেডারের (loop header) মাঝেই এদের জোড়া বা পেয়ারটিকে (pair) আনপ্যাক (unpack) করতে পারেন — এবং প্রয়োজন অনুযায়ী যেকোনো নাম (naming) দিয়ে এর ওই কি (key) বা ভ্যালুগুলোকে (value) গ্রহণ করতে পারেন।
ম্যাপগুলোর (Maps) সাথে স্ট্রাকচারড বাইন্ডিং বা Structured Bindings (সি++১৭ বা C++17)
break এবং continue — লুপ কন্ট্রোল বা Loop Control
এই break মূলত সম্পূর্ণ লুপ (loop) থেকেই বেরিয়ে আসতে (exits) সাহায্য করে — যেমন ধরুন কোনো কনভেয়র বেল্টের (conveyor belt) জরুরি স্টপ বাটন (emergency stop) টেনে ধরা। আর continue মূলত এর বর্তমান চক্রের বা ইটারেশনের (current iteration) ওই নির্দিষ্ট অংশটিকে এড়িয়ে (skips) এর পরবর্তী (next) অংশে জাম্প (jumps) করতে সাহায্য করে — অনেকটা কোনো খারাপ জিনিসকে বেল্ট থেকে ফেলে দিয়ে (tossing) এর লাইনটিকে চালু বা moving রাখার মতো।