Std :: string और std :: basic_string में क्या अंतर है? और दोनों की आवश्यकता क्यों है?


94

बीच क्या अंतर है std::stringऔर std::basic_string? और दोनों की आवश्यकता क्यों है?

जवाबों:


63

std::basic_stringचरित्र प्रकार से बाहर तार बनाने के लिए एक वर्ग टेम्पलेट, है std::stringएक है typedefके लिए उस वर्ग टेम्पलेट की एक विशेषज्ञता के लिए char। हाँ, वे दोनों आवश्यक हैं (या मानक द्वारा कम से कम आवश्यक)।


17
वे दोनों क्यों आवश्यक हैं?
मोहम्मद अल-नकीब

1
तो आप कह रहे हैं कि std :: string टाइपेडिफ std :: basic_string <char> std :: string है?
unresolved_external

1
@MuhammadAnnaqeeb 2.5 वर्ष देर से लेकिन संक्षिप्त उत्तर व्यापक स्ट्रिंग (wstring) (यूनिकोड, प्रति चरित्र 2 बाइट्स, wchar_t) समर्थन प्रदान करने के लिए है।
एंड्रयू

46

std::stringइसका एक तात्कालिकता है std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringसभी प्रकार के तार ( wstringउदाहरण के लिए) के लिए समान इंटरफ़ेस होना आवश्यक है ।


33
उचित शब्द "विशेषज्ञता" है। stringकी विशेषज्ञता है basic_string
एनटी

3
मुझे लगता है कि आप इस बारे में बहस कर सकते हैं। "विशेषज्ञता" का उपयोग आमतौर पर विरासत को इंगित करने के लिए किया जाता है। टेम्प्लेट तर्कों को प्रतिस्थापित करके एक टेम्पर्ड {क्लास | फंक्शन} को तत्काल किया जाता है। आंशिक टेम्पलेट विशेषज्ञता है, लेकिन इसका उपयोग यहां नहीं किया गया है।
अपराह्न

5
एक व्युत्पन्न वर्ग को 'विशेषज्ञता' के रूप में संदर्भित करना 'विशेषज्ञता' का कम औपचारिक उपयोग है। 'स्पेशलाइजेशन' शब्द का उपयोग मानक में बिल्कुल नहीं किया गया है (मैं काफी निश्चित हूं), लेकिन इसका उपयोग बड़े पैमाने पर टेम्पलेट विशेषज्ञता का वर्णन करने के लिए किया गया है। टेम्प्लेट स्पेशलाइजेशन के नाम का उपयोग ऐसे संदर्भों में किया जा सकता है, जो तात्कालिकता को बल नहीं देते हैं और इसलिए विशेषज्ञता और तात्कालिकता अलग-अलग अवधारणाएं हैं। साथ ही एक टेम्पलेट विशेषज्ञता (मापदंडों के एक विशेष सेट के साथ एक टेम्पलेट का नाम), आंशिक विशेषज्ञता (केवल कक्षा टेम्पलेट) और स्पष्ट विशेषज्ञता भी हैं।
सीबी बेली

1
यहां "विशेषज्ञता" का उपयोग करना भ्रामक होगा। एक टेम्पलेट विशेषज्ञता का एक विशिष्ट अर्थ होता है (विरासत से असंबंधित), लेकिन यहां ऐसा नहीं है। std :: string कुछ भी या उससे कम नहीं है जो किसी typedef से कम है, जैसे: namespace std { typedef basic_string<char> string; }तकनीकी रूप से, यह वास्तव में तात्कालिकता नहीं है, लेकिन यह कम से कम करीब (तात्कालिकता, परिभाषा के अनुसार, एक उदाहरण बनाता है, और एक typedef केवल एक नाम बनाता है, उदाहरण नहीं। )।
जेरी कॉफिन

3
@Charles: यह भ्रामक है क्योंकि (टेम्प्लेट के साथ), "विशेषज्ञता" सामान्य रूप से या तो आंशिक विशेषज्ञता, या स्पष्ट विशेषज्ञता को संदर्भित करती है, कि जो कि एक सरल तात्कालिकता के रूप में समाप्त हो जाएगी।
जेरी कॉफ़िन

17

A एक प्रकार के टेम्पलेट std::stringका एक तात्कालिकता std::basic_stringहै char। आपको दोनों की ज़रूरत है ताकि आप इसके अलावा चीजों का तार बना सकें char, जैसे std::basic_string<wchar_t>कि चौड़े पात्रों की एक स्ट्रिंग के लिए। या आप, 32 बिट तत्वों के साथ एक स्ट्रिंग चाहते हैं std::basic_string<unsigned int>


2
मुझे लगता है कि यह शीर्ष मतदान का जवाब होना चाहिए। यह एक प्रकार का उपयोग मामला प्रदान करता है जब आप std::basic_stringएक charप्रकार के बिना झटपट नहीं करेंगे ।
19-28 को hlin117
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.