std :: स्ट्रिंग स्टोर डेटा को किसी भी स्टैक या ढेर पर char * से अलग करता है या क्या यह सिर्फ char * से कक्षा में लिया गया है?std :: स्ट्रिंग बनाम char *
उत्तर
यदि आपका मतलब है, तो यह संगत रूप से स्टोर करता है, तो जवाब यह आवश्यक है कि यह आवश्यक नहीं है लेकिन सभी ज्ञात (मेरे लिए, वैसे भी) कार्यान्वयन ऐसा करते हैं। यह सबसे c_str()
और data()
सदस्य आवश्यकताओं, एक सन्निहित स्ट्रिंग वापस जाने के लिए है जो समर्थन करने के लिए होने की संभावना (c_str()
के मामले में अशक्त-समाप्त)
जहाँ तक जहां स्मृति संग्रहीत किया जाता है के रूप में, यह आमतौर पर ढेर पर है। लेकिन कुछ कार्यान्वयन "शॉर्ट स्ट्रिंग ऑप्टिमाइज़ेशन" को नियोजित करते हैं, जिससे लघु स्ट्रिंग सामग्री को एक छोटे से आंतरिक बफर के भीतर संग्रहीत किया जाता है। इसलिए, यदि स्ट्रिंग ऑब्जेक्ट स्टैक पर है, तो यह संभव है कि संग्रहीत सामग्री भी ढेर पर हों। लेकिन इससे आपको कोई फर्क नहीं पड़ता कि आप इसका उपयोग कैसे करते हैं, क्योंकि ऑब्जेक्ट नष्ट हो जाता है, स्ट्रिंग डेटा को संग्रहीत करने वाली मेमोरी किसी भी मामले में अमान्य हो जाती है।
(Btw, यहाँ an article on a similar technique applied generally, जो अनुकूलन बताते है।)
सी ++ 0x समिति ने पाया कि सभी मौजूदा कार्यान्वयन संरचनाएं व्यवस्थित हैं, इसलिए उन्होंने भाषा को मजबूत करने और इसे एक आवश्यकता बनाने का फैसला किया। क्षमा करें मेरे पास इसका बैक अप लेने का संदर्भ नहीं है। –
@ मार्क: मैंने भी सुना है। – GManNickG
@ मार्क रान्ससम: अच्छा बिंदु, हालांकि यह केवल सी ++ 0x + में लागू होगा; सी ++ 98/03 में उस आवश्यकता नहीं है – dcw
char*
- अपने CPU वास्तुकला के लिए एक सूचक का आकार है।
malloc
याcalloc
याnew
याnew[]
से लौटाया गया मान हो सकता है।- यदि हां, तो
free
याdelete
याdelete[]
को भेजे जाने चाहिए जब आप काम हो गया। - यदि ऐसा है, तो पात्र ढेर पर संग्रहीत हैं।
- यदि हां, तो
char[ N ]
(निरंतर एन) सरणी या स्ट्रिंग शाब्दिक के "अपघटन" से परिणाम हो सकता है।- आम तौर पर, यह बताने का कोई तरीका नहीं है कि
char*
तर्क बिंदु ढेर, ढेर या वैश्विक स्थान पर है।
- आम तौर पर, यह बताने का कोई तरीका नहीं है कि
- कक्षा प्रकार नहीं है। यह अभिव्यक्तियों में भाग लेता है लेकिन इसमें कोई सदस्य कार्य नहीं होता है।
- फिर भी
<algorithm>
और इस तरह के उपयोग के लिए RandomAccessIterator इंटरफ़ेस लागू करता है।
std::string
- कई संकेत के आकार, अक्सर तीन है।
- निर्मित होने पर स्वयं को बनाता है:
new
याdelete
की आवश्यकता नहीं है।- स्ट्रिंग की प्रतिलिपि का मालिक है, यदि स्ट्रिंग को बदला जा सकता है।
- इस स्ट्रिंग को
char*
से कॉपी कर सकते हैं। - डिफ़ॉल्ट रूप से, आंतरिक रूप से
new[]
का उपयोग करता है क्योंकि आपchar*
प्राप्त करना चाहते हैं।
- अंतर्निहित रूपांतरण प्रदान करता है जो
char*
या शाब्दिक से निर्माण को पारदर्शी बनाता है। - कक्षा का प्रकार है। अन्य कैटेनेशन जैसे अभिव्यक्तियों के लिए ऑपरेटरों को परिभाषित करता है।
c_str()
परिभाषित करता है जो अस्थायी उपयोग के लिएchar*
देता है।
begin()
औरend()
साथstd::string::iterator
प्रकार लागू करता है।string::iterator
लचीला है: एक कार्यान्वयन यह एक स्विच की फ्लिप पर एक सीमा-जाँच को अत्यधिक सुरक्षित डिबगिंग सहायक या बस एक सुपर कुशलchar*
कर सकते हैं।
इन विभिन्न समस्याओं का समाधान। char*
(या char const*
) एक सी स्टाइल स्ट्रिंग को इंगित करता है जो कि char*
पॉइंटर को संग्रहीत करने वाले व्यक्ति के स्वामित्व में नहीं है। सी में, स्ट्रिंग प्रकार की कमी के कारण, आप अक्सर char*
"स्ट्रिंग प्रकार" के रूप में उपयोग करते हैं।
std::string
उस स्ट्रिंग डेटा का मालिक है जो इसे इंगित करता है। इसलिए यदि आपको अपनी कक्षा में कहीं भी एक स्ट्रिंग स्टोर करने की आवश्यकता है, संभावना है कि आप std::string
या char*
के बजाय अपनी लाइब्रेरी की स्ट्रिंग क्लास का उपयोग करना चाहते हैं।
std::string
के संग्रहण की संगतता पर, अन्य लोगों ने पहले ही उत्तर दिया है।
- 1. char (char * नहीं) से std :: स्ट्रिंग
- 2. std :: स्ट्रिंग :: लंबाई() बनाम std :: स्ट्रिंग :: आकार()
- 3. सी ++ std :: स्ट्रिंग और नल कॉन्स char *
- 4. std :: स्ट्रिंग या std :: वेक्टर <char> कच्चे डेटा
- 5. प्रदर्शन std :: strstr बनाम std :: स्ट्रिंग ::
- 6. संदिग्ध कॉल (char * से lambda बनाम std :: string) से रूपांतरण
- 7. एक सुरक्षित तरीके से char * से std :: स्ट्रिंग बनाएं
- 8. बूस्ट की प्रतिलिपि :: सर <char> std :: स्ट्रिंग
- 9. std :: cin.getline() बनाम std ::
- 10. एक std :: स्ट्रिंग
- 11. एक std :: स्ट्रिंग
- 12. स्ट्रिंग^से char *
- 13. std :: string को std :: vector <char>
- 14. std :: array <char, N> std :: string
- 15. अस्थायी std :: स्ट्रिंग जंक
- 16. std :: स्ट्रिंग
- 17. उद्देश्य-सी: unichar बनाम char
- 18. वेक्टर <char> स्ट्रिंग सेगमेंटेशन गलती
- 19. std :: स्ट्रिंग, wstring, u16/32string स्पष्टीकरण
- 20. बूस्ट :: ifind_first std :: स्ट्रिंग ऑब्जेक्ट्स
- 21. char
- 22. char से असुरक्षित स्ट्रिंग निर्माण []
- 23. बचें temporaries :: std :: स्ट्रिंग कुंजी
- 24. std :: string में एक const char * को कैसे स्टोर करें?
- 25. char
- 26. std :: size_t बनाम size_t बनाम std :: string :: size_type
- 27. std :: स्ट्रिंग :: c_str() और temporaries
- 28. प्रदर्शन स्ट्रिंगबफ बनाम स्ट्रिंग
- 29. std :: सूची बनाम std :: वेक्टर पुनरावृत्ति
- 30. नई std :: अपवाद बनाम फेंक std :: अपवाद
पॉइंटर्स (और विशेष रूप से 'char * ') वर्ग प्रकार नहीं हैं, और इन्हें प्राप्त नहीं किया जा सकता है। :-) –