Range-Based Algorithms এবং Views

Ranges Library (C++20 এ নতুন) - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) - Computer Programming

277

C++20 তে range-based algorithms এবং views প্রবর্তিত হয়েছে, যা C++ প্রোগ্রামিংয়ে ডেটার ওপর আরও দক্ষ এবং সোজা অপারেশন করার একটি নতুন পদ্ধতি প্রদান করেছে। Range-based algorithms স্ট্যান্ডার্ড লাইব্রেরির অ্যালগরিদমগুলোকে ranges এর উপর প্রয়োগ করতে সাহায্য করে, যা কোড লেখার অভিজ্ঞতা সহজ করে। Views মূলত একটি lazy evaluation কৌশল, যা ডেটার উপর অপারেশন করার সময় কার্যকারিতা বাড়ায় এবং অতিরিক্ত কপি বা অ্যাক্সেসের প্রয়োজনীয়তা কমিয়ে দেয়।

১. Range-based Algorithms

C++20 এর range-based algorithms অ্যালগরিদমগুলোকে স্ট্যান্ডার্ড লাইব্রেরির ranges লাইব্রেরির সাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছে। এর মাধ্যমে আপনি সহজে ranges এবং containers এর উপরে অ্যালগরিদম প্রয়োগ করতে পারেন, যা একাধিক ধাপের অপারেশনকে কমপ্যাক্ট এবং স্পষ্টভাবে সংজ্ঞায়িত করতে সহায়ক।

উদাহরণ: std::ranges::for_each (Range-based algorithm)

std::ranges::for_each একটি রেঞ্জের প্রতিটি উপাদানের উপর একটি ফাংশন প্রয়োগ করতে ব্যবহৃত হয়, যা std::for_each এর মতো কাজ করে, তবে এখানে ranges এর উপর এটি কাজ করে এবং কোনও iterator ব্যবহারের প্রয়োজন হয় না।

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // Range-based for_each ব্যবহার
    std::ranges::for_each(vec, [](int n) {
        std::cout << n * 2 << " ";  // প্রতিটি উপাদানের দ্বিগুণ মান প্রিন্ট করা
    });

    return 0;
}

আউটপুট:

2 4 6 8 10

এখানে, std::ranges::for_each ব্যবহার করে আমরা std::vector<int> এর প্রতিটি উপাদানের উপর একটি ফাংশন প্রয়োগ করেছি এবং প্রতি উপাদানের দ্বিগুণ মান প্রিন্ট করেছি। আপনি এটি ব্যবহার করে সরাসরি ranges এর উপর কাজ করতে পারেন।


২. Views: Lazy Evaluation

Views হল একটি লেটি (lazy) ডেটা প্রক্রিয়া যা ranges উপর অপারেশন করার সময় সমস্ত ডেটা কপি না করে শুধুমাত্র একটি ভিউ তৈরি করে। যখন আপনি একটি view তৈরি করেন, তখন এটি মূল ডেটাকে পরিবর্তন না করে তার উপর অপারেশনগুলো lazy evaluation পদ্ধতিতে করে। এর ফলে, view ডেটা কপি বা অতিরিক্ত মেমরি বরাদ্দ ছাড়াই ডেটার উপরে অপারেশন করতে সক্ষম হয়।

উদাহরণ: std::views::transform (View)

std::views::transform একটি view প্রদান করে যা একটি রেঞ্জের উপর কোনো ট্রান্সফরমেশন ফাংশন প্রয়োগ করে। এটি সঙ্গতিপূর্ণভাবে একে একে উপাদানগুলো পরিবর্তন করে, কিন্তু এটি ডেটার একটি কপি তৈরি করে না।

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // View এর মাধ্যমে transform অপারেশন
    auto transformed = vec | std::views::transform([](int n) { return n * 3; });

    // transformed একটি view, তাই কপি করা হবে না
    for (int n : transformed) {
        std::cout << n << " ";
    }

    return 0;
}

আউটপুট:

3 6 9 12 15

এখানে, std::views::transform ব্যবহার করে, আমরা একটি view তৈরি করেছি যা vec এর প্রতিটি উপাদানকে তিন গুণ বাড়ায়, কিন্তু এটি ডেটার একটি কপি তৈরি করে না। Lazy evaluation এর মাধ্যমে view কেবলমাত্র যখন প্রয়োজন হবে তখনই প্রক্রিয়া করবে।


৩. std::ranges::filter (View)

std::ranges::filter একটি view তৈরি করে যা শুধুমাত্র সেই উপাদানগুলো রাখে যা একটি নির্দিষ্ট শর্ত পূর্ণ করে। এটি ranges এর মধ্যে filtering করতে ব্যবহৃত হয়।

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6};

    // View এর মাধ্যমে filter অপারেশন
    auto even_numbers = vec | std::views::filter([](int n) { return n % 2 == 0; });

    // filtered view থেকে উপাদান প্রিন্ট করা
    for (int n : even_numbers) {
        std::cout << n << " ";
    }

    return 0;
}

আউটপুট:

2 4 6

এখানে, std::ranges::filter ব্যবহার করে আমরা একটি view তৈরি করেছি যা শুধুমাত্র সেই উপাদানগুলো রাখে যা even (যাজ) সংখ্যা, এবং আবার কোনো অতিরিক্ত কপি ছাড়া এটি করা হয়েছে।


৪. std::ranges::sort (Range-based algorithm)

std::ranges::sort একটি নতুন রেঞ্জ-বেসড অ্যালগরিদম যা ranges এর মধ্যে উপাদানগুলোকে সরাসরি সাজায়। এটি আগে std::sort ব্যবহার করে সিকোয়েন্সের উপাদানগুলো সাজাতে হত, কিন্তু এখন ranges::sort এর মাধ্যমে ranges সরাসরি সাজানো সম্ভব।

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> vec = {5, 3, 8, 1, 4};

    // Range-based sort
    std::ranges::sort(vec);

    // সাজানো ভেক্টর প্রিন্ট করা
    for (int n : vec) {
        std::cout << n << " ";
    }

    return 0;
}

আউটপুট:

1 3 4 5 8

এখানে, std::ranges::sort ব্যবহার করে vec এর উপাদানগুলো সরাসরি সাজানো হয়েছে। এটি std::sort এর মতোই কাজ করে, তবে এখানে ranges সরাসরি সাজানো হচ্ছে এবং কোনো ইটরেটরের প্রয়োজন নেই।


৫. std::ranges::reduce (Range-based algorithm)

std::ranges::reduce একটি নতুন রেঞ্জ-বেসড অ্যালগরিদম যা একটি range এর উপর ফোল্ডিং অপারেশন (যেমন যোগফল বা গুণফল) করে।

#include <iostream>
#include <ranges>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // Range-based reduce
    int sum = std::ranges::reduce(vec, 0);  // 0 হচ্ছে আদি মান

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

আউটপুট:

Sum: 15

এখানে, std::ranges::reduce ব্যবহার করে আমরা vec এর সব উপাদান যোগ করেছি।


উপসংহার

  • Range-based algorithms C++20 তে ranges এর উপর অপারেশন করার জন্য একটি উন্নত এবং পরিষ্কার পদ্ধতি সরবরাহ করে। এর মাধ্যমে আপনি সরাসরি ranges এর উপর অ্যালগরিদম প্রয়োগ করতে পারেন, যেটি std::for_each, std::sort, std::reduce ইত্যাদি অন্তর্ভুক্ত।
  • Views একটি lazy evaluation কৌশল যা ডেটার কপি ছাড়াই অপারেশন করতে সাহায্য করে। std::views::transform এবং std::views::filter এর মতো views ডেটার উপর কার্যকরী অপারেশন করতে সক্ষম।

C++20 এর ranges এবং views কৌশল ব্যবহার করে কোডটি আরও পরিষ্কার, নির্ভরযোগ্য এবং কার্যকরী হতে পারে, বিশেষত যখন বড় ডেটাসেটের সাথে কাজ করা হয়।

Content added By
Promotion

Are you sure to start over?

Loading...