C++20 তে Ranges যোগ করা হয়েছে, যা কনটেইনারের উপর কাজ করার নতুন এবং শক্তিশালী উপায় প্রদান করে। Ranges লাইব্রেরি এমন ফাংশনাল প্রোগ্রামিং ধারণা অনুসরণ করে, যেখানে ডেটা ট্রাভার্সাল এবং ম্যানিপুলেশন আরো সহজ, কার্যকরী এবং ধারাবাহিকভাবে করা যায়। Ranges মূলত স্ট্যান্ডার্ড কনটেইনারগুলির সাথে ব্যবহার করার জন্য একটি নতুন ধরনের অ্যাবস্ট্রাকশন প্রদান করে, যা তাদের সাথে বিভিন্ন অ্যালগরিদম সংযুক্ত করতে সহজ করে তোলে।
Ranges লাইব্রেরির বৈশিষ্ট্য
Ranges লাইব্রেরি একটি নতুন API প্রদান করে, যা পরবর্তী সময়ে C++ কনটেইনারগুলির সাথে একত্রে কাজ করার জন্য ডিজাইন করা হয়েছে। এর কিছু বৈশিষ্ট্য হলো:
- Range-based View: কনটেইনারের উপাদানগুলোকে ইটারেটরের মতো অ্যাক্সেস করা যায়, কিন্তু কোড আরও পরিষ্কার এবং কমপ্যাক্ট হয়।
- Lazy Evaluation: Ranges লাইব্রেরির অ্যালগরিদমগুলো “lazy” উপায়ে কাজ করে, যার মানে হলো কেবলমাত্র যখন ফলাফল প্রয়োজন, তখনই কাজগুলো কার্যকর হয়।
- Composability: Ranges অ্যালগরিদমগুলোকে সহজে একসাথে কম্পোজ করা যায়, যার ফলে জটিল লজিক খুব কম কোডে লেখা সম্ভব হয়।
C++ এর অন্যান্য কনটেইনারের সাথে Ranges এর ইন্টিগ্রেশন
C++20 এর Ranges লাইব্রেরি অন্যান্য কনটেইনারের সাথে খুব সহজে কাজ করতে পারে। এটি মূলত কনটেইনারের উপাদানগুলোর উপর বিভিন্ন অ্যালগরিদম প্রয়োগ করতে সহায়তা করে, যেমন std::vector, std::list, std::array, std::map ইত্যাদি। এখানে Ranges লাইব্রেরি ব্যবহার করে কনটেইনারের সাথে ইন্টিগ্রেশন করার কিছু উদাহরণ দেওয়া হলো।
১. Ranges with std::vector
std::vector একটি বহুল ব্যবহৃত কনটেইনার, এবং ranges লাইব্রেরি ব্যবহার করে এটি আরও শক্তিশালী এবং ব্যবহারযোগ্য হয়।
উদাহরণ:
#include <iostream>
#include <vector>
#include <ranges>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// ranges লাইব্রেরি ব্যবহার করে ফিল্টার এবং ট্রান্সফর্ম করা
auto result = vec | std::ranges::views::transform([](int n) { return n * n; })
| std::ranges::views::filter([](int n) { return n > 10; });
// ফলাফল প্রিন্ট করা
for (int n : result) {
std::cout << n << " "; // আউটপুট: 16 25
}
return 0;
}এখানে, std::ranges::views::transform এবং std::ranges::views::filter ব্যবহার করে আমরা std::vector এর উপাদানগুলোর উপর ট্রান্সফর্ম এবং ফিল্টার অপারেশনগুলো প্রয়োগ করেছি। এই ধরনের lazy evaluation এর মাধ্যমে ফলাফলটি কেবল তখনই তৈরি হয় যখন আমরা এটি ব্যবহার করি।
২. Ranges with std::list
std::list এর সাথে ranges লাইব্রেরির ইন্টিগ্রেশনও বেশ কার্যকর। কারণ list কনটেইনারটি একটি দ্বিমুখী সংযুক্ত তালিকা (doubly linked list) হওয়ার কারণে এটি রেঞ্জ অপারেশনে ভালো কাজ করে।
উদাহরণ:
#include <iostream>
#include <list>
#include <ranges>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
// ranges এর মাধ্যমে ট্রান্সফর্ম এবং ফিল্টারিং
auto result = lst | std::ranges::views::transform([](int n) { return n * 2; })
| std::ranges::views::filter([](int n) { return n % 4 == 0; });
// ফলাফল প্রিন্ট করা
for (int n : result) {
std::cout << n << " "; // আউটপুট: 4 8
}
return 0;
}এখানে std::list এর উপাদানগুলোর উপর transform এবং filter অপারেশন প্রয়োগ করা হয়েছে, যেখানে transform সবার মান দ্বিগুণ করে এবং filter কেবলমাত্র এমন মানগুলো রেখে দেয় যেগুলি 4 দিয়ে বিভাজ্য।
৩. Ranges with std::array
std::array একটি স্থির আকারের কনটেইনার যা C++11 এ পরিচিত। এটি ranges লাইব্রেরি ব্যবহার করার জন্য উপযুক্ত, বিশেষ করে যখন জানি যে আর্গুমেন্টের আকার পূর্বনির্ধারিত এবং স্থির।
উদাহরণ:
#include <iostream>
#include <array>
#include <ranges>
int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};
// ranges লাইব্রেরির মাধ্যমে ট্রান্সফর্ম
auto result = arr | std::ranges::views::transform([](int n) { return n * n; });
// ফলাফল প্রিন্ট করা
for (int n : result) {
std::cout << n << " "; // আউটপুট: 1 4 9 16 25
}
return 0;
}এখানে std::array এর উপর transform অপারেশন প্রয়োগ করা হয়েছে, যা প্রতিটি উপাদানকে তার বর্গফল হিসেবে রূপান্তরিত করে।
৪. Ranges with std::map
std::map হল একটি অ্যাসোসিয়েটিভ কনটেইনার যেখানে ডেটা কীগুলোর সাথে মান যুক্ত থাকে। Ranges লাইব্রেরি ব্যবহার করে এর উপাদানগুলোর উপর অপারেশনগুলো সহজে করা যায়।
উদাহরণ:
#include <iostream>
#include <map>
#include <ranges>
int main() {
std::map<int, std::string> map = {{1, "One"}, {2, "Two"}, {3, "Three"}};
// ranges এর মাধ্যমে কীগুলোর উপর কাজ করা
auto result = map | std::ranges::views::transform([](auto& pair) { return pair.first; });
// ফলাফল প্রিন্ট করা
for (int key : result) {
std::cout << key << " "; // আউটপুট: 1 2 3
}
return 0;
}এখানে std::map এর কীগুলোর উপর transform অপারেশন প্রয়োগ করা হয়েছে, যা কেবলমাত্র কীগুলোকে রিটার্ন করছে।
Ranges এর সুবিধা
- স্মার্ট এবং পরিষ্কার কোড: Ranges লাইব্রেরি ব্যবহার করলে ডেটা ম্যানিপুলেশন এবং ট্রাভার্সাল সহজ, পরিষ্কার এবং কার্যকর হয়।
- Lazy Evaluation: Ranges এর অ্যালগরিদমগুলি লেজি উপায়ে কাজ করে, অর্থাৎ কাজগুলো কেবল তখনই সম্পন্ন হয় যখন তা ব্যবহৃত হয়।
- কনসোলিডেটেড অ্যালগরিদম: একাধিক অ্যালগরিদমকে একসাথে এক লাইন কোডে কম্পোজ করা যায়, যা কোডকে আরো সুন্দর এবং সহজ পাঠযোগ্য করে তোলে।
- বড় ডেটা সেটের জন্য কার্যকর: Ranges লাইব্রেরির অপারেশনগুলো বড় ডেটা সেটে কম্পিউটেশন কমায় কারণ এটি আংশিকভাবে ডেটা প্রক্রিয়া করে (lazy evaluation)।
সারাংশ
- Ranges লাইব্রেরি সি++20 তে নতুন এবং শক্তিশালী একটি ফিচার যা কনটেইনারের উপাদানগুলোর উপর অ্যালগরিদম প্রয়োগকে আরও সহজ, পরিষ্কার এবং কার্যকরী করে।
- এটি
std::vector,std::list,std::array,std::mapইত্যাদি কনটেইনারের সাথে খুব সহজে কাজ করতে পারে। - Lazy evaluation এবং composition সুবিধা নিয়ে এটি ফাংশনাল প্রোগ্রামিং স্টাইলের কার্যকারিতা সি++ এ নিয়ে আসে।
Read more