Capturing Variables এবং Stateful Lambdas

Function Objects এবং Lambdas (ফাংশন অবজেক্টস এবং ল্যাম্বডা এক্সপ্রেশন) - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) - Computer Programming

295

সি++ এ ল্যাম্বডা এক্সপ্রেশন হলো এমন এক্সপ্রেশন, যা ছোট ফাংশনের মতো কাজ করে এবং [] ব্র্যাকেটে পরিবর্তনশীল ক্যাপচার করার মাধ্যমে বাইরের স্কোপের ভেরিয়েবলগুলো ব্যবহার করতে পারে। ল্যাম্বডা এক্সপ্রেশনে ক্যাপচারিং কিভাবে এবং কোন ভেরিয়েবলকে অ্যাক্সেস করা যাবে তা নির্ধারণ করে। ল্যাম্বডা এক্সপ্রেশনগুলো স্টেটফুল হতে পারে, অর্থাৎ তারা একটি নির্দিষ্ট অবস্থা (স্টেট) ধরে রাখতে পারে।


১. Capturing Variables

ল্যাম্বডা এক্সপ্রেশন বাইরের স্কোপের ভেরিয়েবলগুলোতে অ্যাক্সেস করতে পারে তার ক্যাপচারিং মেকানিজম ব্যবহার করে। [] ব্র্যাকেটের মধ্যে বিভিন্ন ক্যাপচার মেথড ব্যবহার করা হয়।

ক্যাপচার মেথড:

  • [=]: সমস্ত ভেরিয়েবল কপি করে ক্যাপচার করে।
  • [&]: সমস্ত ভেরিয়েবল রেফারেন্স হিসেবে ক্যাপচার করে।
  • [specific_var]: নির্দিষ্ট ভেরিয়েবল কপি করে ক্যাপচার করে।
  • [&specific_var]: নির্দিষ্ট ভেরিয়েবল রেফারেন্স হিসেবে ক্যাপচার করে।

উদাহরণ:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    int x = 10;
    int y = 20;

    // কপি ক্যাপচারিং
    auto lambda1 = [=]() {
        std::cout << "x = " << x << ", y = " << y << std::endl;
    };

    // রেফারেন্স ক্যাপচারিং
    auto lambda2 = [&]() {
        x = 30; // রেফারেন্সের মাধ্যমে x এর মান পরিবর্তন
        std::cout << "Modified x = " << x << ", y = " << y << std::endl;
    };

    lambda1(); // x = 10, y = 20
    lambda2(); // Modified x = 30, y = 20

    return 0;
}

উপরের উদাহরণে, lambda1 [=] ব্যবহার করে কপি ক্যাপচার করেছে, যা xy এর মানগুলো কপি করে ব্যবহার করছে। অন্যদিকে, lambda2 [&] ব্যবহার করে রেফারেন্স ক্যাপচার করছে, যা বাইরের ভেরিয়েবলগুলো সরাসরি পরিবর্তন করতে সক্ষম।


২. Stateful Lambdas

স্টেটফুল ল্যাম্বডা এমন ল্যাম্বডা এক্সপ্রেশন যা তার নিজস্ব স্টেট ধরে রাখতে পারে। এটি সাধারণত ক্যাপচার করা ভেরিয়েবলের মান পরিবর্তন করে এবং সেই পরিবর্তিত মান পরবর্তীতে ব্যবহার করতে পারে। স্টেটফুল ল্যাম্বডায় মিউটেবল স্টেট ধরে রাখার জন্য mutable কীওয়ার্ড প্রয়োজন হয়।

Stateful Lambda উদাহরণ:

#include <iostream>

int main() {
    int counter = 0;

    // মিউটেবল ল্যাম্বডা ব্যবহার
    auto incrementCounter = [counter]() mutable {
        counter++;
        return counter;
    };

    std::cout << incrementCounter() << std::endl; // আউটপুট: 1
    std::cout << incrementCounter() << std::endl; // আউটপুট: 2
    std::cout << incrementCounter() << std::endl; // আউটপুট: 3

    return 0;
}

এখানে counter ভেরিয়েবলটি কপি করা হয়েছে এবং mutable কীওয়ার্ড ব্যবহার করে এই কপি করা ভেরিয়েবলটি প্রতিবার কল করার সময় পরিবর্তন করা হচ্ছে। mutable ব্যবহার না করলে কপি করা ভেরিয়েবলের মান অপরিবর্তনীয় থাকবে।


Stateful Lambda এর ব্যবহার ক্ষেত্র

Stateful Lambdas বিভিন্ন কাজের জন্য উপযোগী, যেমন:

  1. অবস্থা ধরে রাখা: একটি নির্দিষ্ট ফাংশন বা প্রসেসের অবস্থা মেমোরিতে ধরে রাখার জন্য।
  2. কাউন্টার বা অ্যাকুমুলেটর হিসাব: ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে সংখ্যার কাউন্টার বা অ্যাকুমুলেটর হিসাব করা।
  3. কোমপ্লেক্স লজিক: স্টেটফুল ল্যাম্বডা ফাংশন ব্যবহার করে জটিল লজিক তৈরিতে।

কিছু গুরুত্বপূর্ণ বিষয়

  • Mutable vs Immutable: স্টেটফুল ল্যাম্বডায় mutable কীওয়ার্ড ব্যবহার না করলে ক্যাপচার করা কপি অপরিবর্তনীয় থাকে।
  • ল্যাম্বডা এক্সপ্রেশন পরিপূরক: ল্যাম্বডা এক্সপ্রেশন কম্প্যাক্ট এবং কার্যকর কোড লেখায় সহায়ক, যা সহজেই অন্যান্য ফাংশনে পাস বা সংরক্ষণ করা যায়।

সংক্ষেপে

  • Capturing Variables: ল্যাম্বডা বাইরের ভেরিয়েবলগুলোকে কপি বা রেফারেন্স ক্যাপচারের মাধ্যমে অ্যাক্সেস করতে পারে।
  • Stateful Lambdas: ল্যাম্বডা এক্সপ্রেশন নিজস্ব স্টেট ধরে রাখতে পারে, যা mutable কীওয়ার্ডের মাধ্যমে পরিবর্তন করা যায়।

ল্যাম্বডা এক্সপ্রেশন, ভেরিয়েবল ক্যাপচারিং, এবং স্টেটফুল ল্যাম্বডা আধুনিক সি++ প্রোগ্রামিংকে সহজ, সংক্ষিপ্ত এবং কার্যকরী করে তুলেছে।

Content added By
Promotion

Are you sure to start over?

Loading...