इस विस्तार के लिए प्रेरणा, जो एक अनुरूप कार्यक्रम द्वारा पता लगाने योग्य है, और इस प्रकार गैर-अनुरूप है vector<bool>
vector<char>
संदर्भों के संबंध में अधिक व्यवहार करना है (कास्ट और अन्यथा)।
परिचय
1998 के बाद से, vector<bool>
"काफी कंटेनर नहीं है।" LWG 96 , पहले LWG मुद्दों में से एक, ने बहस शुरू की। आज, 17 साल बाद,vector<bool>
काफी हद तक अपरिवर्तित है।
यह पेपर कुछ विशिष्ट उदाहरणों पर जाता है कि किस तरह से व्यवहार vector<bool>
हर दूसरे के तात्कालिकता से भिन्न होता है vector
, इस प्रकार सामान्य कोड को नुकसान पहुंचा रहा है। हालांकि एक ही कागज की लंबाई बहुत अच्छे प्रदर्शन गुणों पर चर्चा करती हैvector<bool>
अगर ठीक से लागू किया जा सकता है।
सारांश : vector<bool>
एक बुरा कंटेनर नहीं है। यह वास्तव में काफी उपयोगी है। इसका सिर्फ एक बुरा नाम है।
वापस const_reference
जैसा कि ऊपर प्रस्तुत किया गया है, और यहां विस्तृत है , इसके बारे vector<bool>
में क्या बुरा है कि यह अन्य vector
तात्कालिकताओं की तुलना में सामान्य कोड में अलग तरह से व्यवहार करता है। यहाँ एक ठोस उदाहरण दिया गया है:
#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]); // Fires!
}
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
असाइन किए जाने पर) के साथ चलाया जाता है , तो परीक्षण गुजरता है।
vector<bool>
जेनेरिक कोड में अलग तरह से व्यवहार करने के नकारात्मक प्रभावों को कम करने के लिए मांगी गई libc ++ कार्यान्वयन । इसे प्राप्त करने के लिए एक बात यह है कि निर्दिष्ट के समान vector<T>::const_reference
एक प्रॉक्सी-संदर्भ बनाना है vector<T>::reference
, सिवाय इसके कि आप इसके माध्यम से असाइन नहीं कर सकते। यानी, libc ++ पर,vector<T>::const_reference
अनिवार्य रूप से उस बिट vector
की एक कॉपी के बजाय, अंदर के बिट के लिए एक पॉइंटर है ।
Libc ++ पर उपरोक्त test
दोनों के लिए गुजरता है vector<char>
और vector<bool>
।
किस कीमत पर?
नकारात्मक पक्ष यह है कि यह विस्तार पता लगाने योग्य है, जैसा कि प्रश्न में दिखाया गया है। हालांकि, बहुत कम प्रोग्राम वास्तव में इस उपनाम के सटीक प्रकार के बारे में परवाह करते हैं, और अधिक कार्यक्रम व्यवहार के बारे में परवाह करते हैं।
इस गैर-अनुरूपता के लिए प्रेरणा क्या है?
जेनेरिक कोड में libc ++ क्लाइंट को बेहतर व्यवहार देने के लिए, और शायद पर्याप्त फ़ील्ड परीक्षण के बाद, इस एक्सटेंशन को भविष्य के C ++ मानक के लिए पूरे C ++ उद्योग की बेहतरी के लिए प्रस्तावित करें।
इस तरह का प्रस्ताव एक नए कंटेनर (जैसे bit_vector
) के रूप में आ सकता है vector<bool>
, जिसमें आज के समान ही एपीआई है , लेकिन कुछ उन्नयन जैसे कि const_reference
यहां चर्चा की गई है। vector<bool>
विशेषज्ञता के पदावनति (और अंतिम निष्कासन) के बाद । bitset
इस विभाग में थोड़ा उन्नयन का उपयोग भी कर सकता है, उदाहरण के लिए const_reference
, और पुनरावृत्तियों का एक सेट।
यही है, के लिए hindsight bitset
में है vector<bool>
(जिसे bit_vector
- या जो भी नाम दिया जाना चाहिए ), जैसा array
कि है vector
। और सादृश्य सच धारण करने के लिए किया जाए या नहीं के बारे में हम बात कर रहे हैं चाहिए bool
के रूप में value_type
की vector
और array
।
C ++ 11 और C ++ 14 सुविधाओं के कई उदाहरण हैं जो libc ++ में एक्सटेंशन के रूप में शुरू हुए हैं। इस तरह मानकों का विकास होता है। वास्तविक रूप से प्रदर्शित सकारात्मक क्षेत्र अनुभव मजबूत प्रभाव को वहन करता है। जब यह मौजूदा विनिर्देशों को बदलने की बात आती है तो मानक लोक एक रूढ़िवादी गुच्छा होते हैं (जैसा कि उन्हें होना चाहिए)। अनुमान लगाना, यहां तक कि जब आप सुनिश्चित हैं कि आप सही ढंग से अनुमान लगा रहे हैं, तो अंतरराष्ट्रीय स्तर पर मान्यता प्राप्त मानक विकसित करने के लिए एक जोखिम भरा रणनीति है।
vector<bool>
अधिक प्रथम श्रेणी के पायदान पर रख सकता है ?