এর একটি সুবিধা std::begin
এবং std::end
এটি হ'ল তারা বাহ্যিক শ্রেণীর জন্য স্ট্যান্ডার্ড ইন্টারফেস প্রয়োগের জন্য এক্সটেনশন পয়েন্ট হিসাবে পরিবেশন করে।
আপনি যদি CustomContainer
লুপ বা টেম্পলেট ফাংশনটির প্রত্যাশা .begin()
এবং .end()
পদ্ধতিগুলির জন্য পরিসীমা ভিত্তিক শ্রেণি ব্যবহার করতে চান তবে আপনাকে অবশ্যই এই পদ্ধতিগুলি প্রয়োগ করতে হবে।
ক্লাস যদি এই পদ্ধতিগুলি সরবরাহ করে তবে এটি কোনও সমস্যা নয়। যখন এটি হয় না, আপনাকে এটি * পরিবর্তন করতে হবে।
এটি সর্বদা সম্ভব হয় না, উদাহরণস্বরূপ, বহিরাগত গ্রন্থাগার ব্যবহার করার সময়, প্রচ্ছন্নভাবে বাণিজ্যিক এবং বদ্ধ উত্সটি।
এই ধরনের পরিস্থিতিতে, std::begin
এবং std::end
উপকারে আসুন, যেহেতু কেউ ক্লাস নিজেই পরিবর্তন না করে পুনরাবৃত্তিকারী এপিআই সরবরাহ করতে পারে, বরং ফ্রি ফাংশনগুলিকে ওভারলোড করে।
উদাহরণ: ধরুন যে আপনি এমন count_if
ফাংশন বাস্তবায়ন করতে চান যা একজোড়া পুনরাবৃত্তির পরিবর্তে একটি ধারক গ্রহণ করে। এই জাতীয় কোডটি এর মতো দেখতে পারে:
template<typename ContainerType, typename PredicateType>
std::size_t count_if(const ContainerType& container, PredicateType&& predicate)
{
using std::begin;
using std::end;
return std::count_if(begin(container), end(container),
std::forward<PredicateType&&>(predicate));
}
এখন, আপনি যে কোনও শ্রেণীর জন্য এই রীতিনীতিটি ব্যবহার করতে চান count_if
, সেই ক্লাসগুলি সংশোধন করার পরিবর্তে আপনাকে কেবল দুটি ফ্রি ফাংশন যুক্ত করতে হবে।
এখন, সি ++ এর আর্গুমেন্ট ডিপেন্ডেন্ট লুকআপ
(এডিএল) নামে একটি মেকানিসিম রয়েছে, যা এই ধরণের পদ্ধতিকে আরও নমনীয় করে তোলে।
সংক্ষেপে, এডিএলটির অর্থ, যখন কোনও সংকলক একটি অযোগ্য ফাংশন (অর্থাত্ নেমস্পেস ব্যতীত ফাংশন, begin
তার পরিবর্তে std::begin
) সমাধান করে, তখন তার যুক্তিগুলির নামস্থানগুলিতে ঘোষিত ফাংশনগুলিও বিবেচনা করবে। উদাহরণ স্বরূপ:
namesapce some_lib
{
// let's assume that CustomContainer stores elements sequentially,
// and has data() and size() methods, but not begin() and end() methods:
class CustomContainer
{
...
};
}
namespace some_lib
{
const Element* begin(const CustomContainer& c)
{
return c.data();
}
const Element* end(const CustomContainer& c)
{
return c.data() + c.size();
}
}
// somewhere else:
CustomContainer c;
std::size_t n = count_if(c, somePredicate);
এই ক্ষেত্রে, এটা কোন ব্যাপার না যে যোগ্যতাসম্পন্ন নাম some_lib::begin
এবং some_lib::end
- যেহেতু CustomContainer
হয় some_lib::
খুব, কম্পাইলার ঐ overloads ব্যবহার করবে count_if
।
এটি থাকার using std::begin;
এবং using std::end;
ভিতরে থাকার কারণও count_if
। এটা আমাদের অযোগ্য ব্যবহার করার অনুমতি দেয় begin
এবং end
সেইজন্য ADL জন্য, যার ফলে এবং
কম্পাইলার বাছাই করতে সক্ষম হবেন std::begin
এবং std::end
যখন অন্য কোন বিকল্প পাওয়া যায়।
আমরা কুকিটি খেতে পারি এবং কুকি রাখতে পারি - যেমন begin
/ end
এর সংযোজনকারীটি স্ট্যান্ডার্ডগুলিতে ফিরে যেতে পারে তার কাস্টম বাস্তবায়ন করার একটি উপায় আছে ।
কিছু নোট:
একই কারণে, অন্যান্য অনুরূপ ফাংশন রয়েছে: std::rbegin
/ rend
,
std::size
এবং std::data
।
অন্যান্য উত্তরের হিসাবে উল্লেখ করা হয়েছে, std::
সংস্করণগুলিতে নগ্ন অ্যারেগুলির জন্য অতিরিক্ত পরিমাণ রয়েছে। এটি দরকারী, তবে কেবল আমি উপরে বর্ণিত একটি বিশেষ বিষয়।
std::begin
টেমপ্লেট কোড লেখার সময় ব্যবহার এবং বন্ধুরা বিশেষত ভাল ধারণা, কারণ এটি সেই টেমপ্লেটগুলিকে আরও জেনেরিক করে তোলে। অ-টেম্পলেট জন্য আপনি প্রযোজ্য সময়ে ঠিক একই পদ্ধতি ব্যবহার করতে পারেন।
পিএস আমি জানি যে এই পোস্টটি প্রায় 7 বছরের পুরানো। আমি এটি পেরিয়ে এসেছি কারণ আমি এমন একটি প্রশ্নের উত্তর দিতে চেয়েছিলাম যা সদৃশ হিসাবে চিহ্নিত হয়েছিল এবং আবিষ্কার হয়েছিল যে এখানে কোনও উত্তর এডিএল উল্লেখ করে না।