2013-07-30 13 views

उत्तर

12

यह लंबाई

हाँ शामिल हैं। यह सी ++ 11 मानक द्वारा आवश्यक है।

§ 21.4.4

size_type size() const noexcept;
1. रिटर्न: स्ट्रिंग में वर्तमान में चार वस्तुओं की तरह संख्या की गणना।
2. जटिलता: निरंतर समय।

नोट हालांकि, यह यूनिकोड से अनजान है।


यह शून्य समाप्त

हाँ है।यह सी ++ 11 मानक द्वारा भी आवश्यक है कि std::basic_string::c_str [0, आकार()] की सीमा के लिए एक वैध सूचक देता है जिसमें my_string[my_string.size()] मान्य होगा, इसलिए एक शून्य चरित्र।

§ 21.4.7.1

const charT* c_str() const noexcept;
const charT* data() const noexcept;
1. रिटर्न: एक सूचक p ऐसी है कि प्रत्येक i के लिए p + i == &operator[](i)[0,size()] में।
2. जटिलता: निरंतर समय।
3. की आवश्यकता है: प्रोग्राम वर्ण सरणी में संग्रहीत के किसी भी मान को परिवर्तित नहीं करेगा।

+0

अच्छी तरह से मैंने कल्पना को पढ़कर सी # सीखा, मैं सी ++ के लिए भी ऐसा ही कर सकता हूं। मुझे इसकी एक प्रति कहां मिल सकती है? –

+2

@ जोनाथनएलेन मैं मानक से नहीं सीखूंगा, यह मानक से भरा है इसलिए इसे पढ़ना मुश्किल होगा। हालांकि, आप कई ड्राफ्ट्स के साथ सी ++ 14 सीडी [यहां] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3690.pdf) पा सकते हैं। मानकीकरण प्रक्रिया। – Rapptz

+0

@ जोनाथनएलेन सबसे अच्छा मूल्य-मुक्त विकल्प [open-std.org] है (http://www.open-std.org/JTC1/SC22/WG21/); आप वहां आधिकारिक संस्करण नहीं प्राप्त कर सकते हैं, लेकिन आप नवीनतम ड्राफ्ट प्राप्त कर सकते हैं जो प्रिंट-स्टाइल में केवल अलग है। कुछ खोज करने में यह पता चलता है कि कौन सा सबसे पुराना-पुराना-प्रकाशित है, हालांकि। – Angew

10

हम नहीं जानते। यह कार्यान्वयन के लिए पूरी तरह से है। (कम से कम C++ 03 तक - स्पष्ट रूप से C++ 11 को आंतरिक बफर को 0-समाप्त होने की आवश्यकता होती है।) यदि आप जिसका उपयोग कर रहे हैं, तो आप COS+ मानक लाइब्रेरी कार्यान्वयन के स्रोत कोड को देख सकते हैं। कि से


अलावा, मैं इसे तार्किक अगर यह NUL-समाप्त और यह रूप में अच्छी तरह एक स्पष्ट लंबाई संग्रहीत था पाते हैं। यह अच्छा है क्योंकि तब यह और एक वैध सी स्ट्रिंग लंबाई वापस जाने के लिए लगातार समय लगता है:

size_t length() 
{ 
    return m_length; 
} 

const wchar_t *c_str() 
{ 
    return m_cstr; 
} 

यदि यह एक स्पष्ट लंबाई की दुकान नहीं किया था, तो size() पात्रों को गिनना पड़ता अप NUL को O(n) में, जो आप इससे बच सकते हैं तो अपमानजनक है।

यदि, हालांकि, आंतरिक बफर एनयूएल-समाप्त नहीं किया गया था, लेकिन यह केवल लंबाई को संग्रहीत करता था, तो उचित एनयूएल-समाप्त सी स्ट्रिंग बनाने के लिए यह कठिन होगा: स्ट्रिंग को या तो अपने भंडारण को पुन: आवंटित करना होगा और 0 जोड़ें (और पुनर्वितरण एक महंगी ऑपरेशन है), या इसे पूरे बफर को कॉपी करना होगा, जो कि फिर से O(n) ऑपरेशन है।

(चेतावनी: बेशर्म स्वयं को बढ़ावा देने - एक सी भाषा परियोजना में मैं वर्तमान पर काम कर रहा हूँ, मैं वास्तव में इस दृष्टिकोण लचीला स्ट्रिंग वस्तुओं को लागू करने के लिया है।)

+4

यह है [अशक्त-समाप्त C++ होने की गारंटी 11] (http://stackoverflow.com/questions/6077189/ -शून्य-समाप्त होगा-stdstring-हमेशा होने में-C11-)। –

0

basic_string (जिसमें से wstring typedef है) टर्मिनेटर की कोई ज़रूरत नहीं है।

हां, यह अपनी लंबाई का प्रबंधन करता है।

यदि आपको स्ट्रिंग/wstring के एक शून्य-समाप्त (उर्फ सी स्ट्रिंग) संस्करण की आवश्यकता है, तो c_str() पर कॉल करें। लेकिन इसमें इसके अंदर एक शून्य चरित्र हो सकता है, जिस स्थिति में सी स्ट्रिंग को संभालने के लिए हर सी फ़ंक्शन काफी संपूर्ण स्ट्रिंग को देखने में विफल हो जाएगा।

+1

मुझे डर है कि यह सवाल का जवाब नहीं देता है। ओपी स्ट्रिंग के ** आंतरिक कार्यान्वयन ** के बारे में पूछ रहा है, वह शायद '.c_str()' सदस्य समारोह के बारे में बहुत अच्छी तरह से अवगत है और जानता है कि इसका उपयोग क्यों और कब किया जाए। साथ ही, मुझे उम्मीद है कि आप सी मानक लाइब्रेरी में विस्तृत स्ट्रिंग हैंडलिंग फ़ंक्शंस के बारे में जानते हैं, जैसे 'wstrlen() '। –

+0

असल में मैं एक पत्रकार हूं जो प्लेटफ़ॉर्म :: स्ट्रिंगरफेरेंस wchar_t * और wstring के संयोजन के साथ काम करता है, इस बारे में लिखने की कोशिश कर रहा है। स्पष्ट रूप से स्ट्रिंग रेफरेंस "को प्रतिलिपि बनाने के बिना काम करने के लिए एक नल टर्मिनेटेड स्ट्रिंग (wchar_t * या wstring)" की आवश्यकता होती है। या शायद उसका मतलब है "एक (शून्य प्रकार की तार की तरह समाप्त की गई स्ट्रिंग की आवश्यकता है) या wstring"। बहुत बुरे शब्दों में माता-पिता नहीं हैं। –

+1

हां, मैंने अपने प्रश्न का उत्तर नहीं दिया, चुने गए उत्तर ने एक घंटे बाद मेरे जैसा ही तीन जवाब दिए। हो सकता है कि मुझे सिर्फ प्रश्न को संबोधित किए बिना एक लंबा गद्य लिखना चाहिए, या गलत व्याख्या करने के दौरान मानक को उद्धृत करना चाहिए। – DanielKO

संबंधित मुद्दे