এই সম্প্রসারণের অনুপ্রেরণা, যা একটি অনুবর্তনযোগ্য প্রোগ্রাম দ্বারা সনাক্তযোগ্য এবং এইভাবে অ-সঙ্গতিপূর্ণ নয়, তা হল রেফারেন্সের ক্ষেত্রে (কনস্ট এবং অন্যথায়) vector<bool>আচরণের মতো আচরণ করা vector<char>।
ভূমিকা
1998 সাল থেকে, vector<bool>"যথেষ্ট ধারক নয়" হিসাবে উপহাস করা হচ্ছে। LWG 96 , একেবারে প্রথম এলডাব্লুজি ইস্যুগুলির মধ্যে একটি, বিতর্কটি শুরু করেছিল। আজ, 17 বছর পরে, vector<bool>মূলত অপরিবর্তিত রয়েছে।
এই কাগজটি এইভাবে জেনেরিক vector<bool>কোডকে vectorআঘাত করে, এর অন্য প্রতিটি ইনস্ট্যান্টেশন থেকে আচরণের পার্থক্য সম্পর্কে কিছু নির্দিষ্ট উদাহরণে যায় । তবে একই কাগজটি vector<bool>সঠিকভাবে প্রয়োগ করা হলে খুব সুন্দর পারফরম্যান্স বৈশিষ্ট্যগুলি দৈর্ঘ্যে আলোচনা করে ।
সংক্ষিপ্তসার : vector<bool>একটি খারাপ ধারক নয়। এটি আসলে বেশ কার্যকর। এটির একটি খারাপ নাম রয়েছে।
আবার const_reference
যেমন উপরে উপস্থাপন করা হয়েছে, এবং এখানে বিশদ হিসাবে যা খারাপ তা হ'ল vector<bool>এটি অন্যান্য vectorতাত্ক্ষণের চেয়ে জেনেরিক কোডে আলাদা আচরণ করে । এখানে একটি দৃ concrete় উদাহরণ:
#include <cassert>
#include <vector>
template <class T>
void
test(std::vector<T>& v)
{
using const_ref = typename std::vector<T>::const_reference;
const std::vector<T>& cv = v;
const_ref cr = cv[0];
assert(cr == cv[0]);
v[0] = 1;
assert(true == cv[0]);
assert(cr == cv[0]);
}
int
main()
{
std::vector<char> vc(1);
test(vc);
std::vector<bool> vb(1);
test(vb);
}
স্ট্যান্ডার্ড স্পেসিফিকেশন বলছে যে চিহ্নিত দাবীটি // Fires!ট্রিগার করবে, তবে কেবল যখন testএকটি দিয়ে চালানো হবে vector<bool>। যখন একটি দিয়ে চালানো vector<char>(অথবা কোন vectorব্যতীত boolযখন একটি যথাযথ অ ডিফল্ট Tনির্ধারিত হয়), পরীক্ষা প্রেরণ করা হয়।
Libc ++ প্রয়োগটি vector<bool>জেনেরিক কোডে অন্যরকম আচরণ করার নেতিবাচক প্রভাবগুলি হ্রাস করতে চেয়েছিল । এটি অর্জন করতে vector<T>::const_referenceএকটি কাজ এটি হ'ল নির্দিষ্ট প্রকৃতির মতোই প্রক্সি-রেফারেন্স তৈরি করা , vector<T>::referenceআপনি এটির মাধ্যমে নির্ধারণ করতে পারবেন না except এটি হ'ল, libc ++ vector<T>::const_referenceএ মূলত বিটের vectorঅনুলিপিটির পরিবর্তে বিটের অভ্যন্তরে একটি পয়েন্টার ।
লাইবসি ++ এ উপরোক্ত testউভয় vector<char>এবং এর জন্য পাস করে vector<bool>।
কি দামে?
ক্ষয়ক্ষতিটি হ'ল এই এক্সটেনশনটি সনাক্তকরণযোগ্য, যেমন প্রশ্নটিতে দেখানো হয়েছে। তবে, খুব অল্প প্রোগ্রামই আসলে এই উরফের সঠিক ধরণের বিষয়ে যত্নশীল এবং আরও প্রোগ্রামগুলি আচরণ সম্পর্কে যত্নশীল।
এই নিরপেক্ষতার জন্য প্রেরণা কী?
জেনেরিক কোডে libc ++ ক্লায়েন্টকে আরও ভাল আচরণ করতে এবং সম্ভবত যথেষ্ট ফিল্ড টেস্টিংয়ের পরে পুরো সি ++ শিল্পের উন্নতির জন্য ভবিষ্যতের সি ++ স্ট্যান্ডার্ডকে এই এক্সটেনশনটির প্রস্তাব দিন।
এই জাতীয় প্রস্তাবনাটি একটি নতুন ধারক (উদাহরণস্বরূপ bit_vector) আকারে আসতে পারে যা আজকের মতো অনেকগুলি একই API রয়েছে vector<bool>তবে const_referenceএখানে আলোচিত কয়েকটি আপগ্রেড সহ with vector<bool>বিশেষীকরণের অবচয় (এবং শেষ অবধি) অনুসরণ করে । bitsetএছাড়াও এই বিভাগে কিছুটা আপগ্রেডিং ব্যবহার করতে পারে, যেমন অ্যাড const_referenceএবং পুনরাবৃত্তির একটি সেট।
এটি হ'ল অন্ধকারে bitsetযা হয় vector<bool>(যা নামকরণ করা উচিত bit_vector- বা যাই হোক না কেন), যেমন arrayহয় vector। আর উপমা সত্য রাখা হোক বা না হোক আমরা বলছি কর্তব্য boolহিসাবে value_typeএর vectorএবং array।
সি ++ 11 এবং সি ++ 14 বৈশিষ্ট্যের একাধিক উদাহরণ রয়েছে যা libc ++ এ এক্সটেনশন হিসাবে শুরু হয়েছিল। স্ট্যান্ডার্ডগুলি এভাবেই বিকশিত হয়। প্রকৃত প্রদর্শিত ইতিবাচক ক্ষেত্র অভিজ্ঞতা শক্তিশালী প্রভাব বহন করে। বিদ্যমান স্পেসিফিকেশনগুলি (যেমন তাদের হওয়া উচিত) পরিবর্তন করার ক্ষেত্রে মানগুলি লোকগুলি একটি রক্ষণশীল গুচ্ছ হয়। অনুমান করা, এমনকি আপনি যখন নিশ্চিত হন যে আপনি সঠিকভাবে অনুমান করছেন তখনও আন্তর্জাতিকভাবে স্বীকৃত মানটি বিকশিত করার জন্য একটি ঝুঁকিপূর্ণ কৌশল।
vector<bool>আরও প্রথম-শ্রেণীর ভিত্তি স্থাপন করতে পারে?