String_view क्या है?


162

string_viewC ++ लाइब्रेरी फंडामेंटल्स TS ( N3921 ) के भीतर C ++ 17 में जोड़ा गया एक प्रस्तावित फीचर था

जहां तक ​​मैं समझता हूं कि यह एक प्रकार है जो किसी प्रकार के स्ट्रिंग "अवधारणा" का प्रतिनिधित्व करता है, जो कि किसी भी प्रकार के कंटेनर का एक दृश्य है जो स्ट्रिंग के रूप में देखने योग्य कुछ स्टोर कर सकता है।

  • क्या यह सही है ?
  • क्या विहित const std::string&पैरामीटर प्रकार बनना चाहिए string_view?
  • क्या string_viewविचार करने के बारे में एक और महत्वपूर्ण बिंदु है ?

4
अंत में, किसी को पता चलता है कि तार को एक अलग शब्दार्थ की आवश्यकता है, हालांकि string_view को शुरू करना केवल एक छोटा कदम है।
जॉन जेड। ली

जवाबों:


183

किसी भी और सभी प्रकार के "स्ट्रिंग संदर्भ" और "सरणी संदर्भ" प्रस्तावों का उद्देश्य उन डेटा की प्रतिलिपि बनाने से बचना है जो पहले से ही कहीं और स्वामित्व में हैं और जिनमें से केवल एक गैर-म्यूटिंग दृश्य की आवश्यकता है। string_viewसवाल में ऐसे ही एक प्रस्ताव है, पहले वाले भी बुलाए गए थे string_refऔर array_refवे भी।

विचार हमेशा पॉइंटर-टू-फर्स्ट-एलीमेंट की जोड़ी और कुछ मौजूदा डेटा ऐरे या स्ट्रिंग के आकार को संग्रहीत करने का होता है ।

इस तरह के व्यू-हैंडल क्लास को सस्ते में मूल्य के हिसाब से पास किया जा सकता है और यह सस्ते प्रतिस्थापन संचालन की पेशकश करेगा (जिसे सरल सूचक वेतन वृद्धि और आकार समायोजन के रूप में लागू किया जा सकता है)।

स्ट्रिंग्स के कई उपयोगों में स्ट्रिंग्स के वास्तविक मालिक की आवश्यकता नहीं होती है, और प्रश्न में स्ट्रिंग अक्सर किसी और के स्वामित्व में होगी। इसलिए अनावश्यक प्रतियों से बचकर दक्षता बढ़ाने की एक वास्तविक क्षमता है (उन सभी आवंटन और अपवादों के बारे में सोचें जिन्हें आप बचा सकते हैं)।

मूल C स्ट्रिंग्स इस समस्या से पीड़ित थे कि अशक्त टर्मिनेटर स्ट्रिंग APIs का हिस्सा था, और इसलिए आप अंतर्निहित स्ट्रिंग (a la strtok) को म्यूट किए बिना आसानी से सबस्ट्रिंग नहीं बना सकते । C ++ में, यह आसानी से लंबाई को अलग-अलग स्टोर करके और पॉइंटर और साइज को एक कक्षा में लपेटकर आसानी से हल किया जाता है।

सी ++ मानक पुस्तकालय दर्शन से एक बड़ी बाधा और विचलन, जो मैं सोच सकता हूं कि इस तरह के "संदर्भात्मक दृश्य" वर्गों में बाकी मानक पुस्तकालय से पूरी तरह से अलग-अलग स्वामित्व शब्दार्थ हैं। मूल रूप से, मानक पुस्तकालय में बाकी सब कुछ बिना शर्त सुरक्षित और सही है (यदि यह संकलित है, तो यह सही है)। इस तरह के संदर्भ वर्गों के साथ, यह अब सच नहीं है। आपके प्रोग्राम की शुद्धता इन वर्गों का उपयोग करने वाले परिवेश कोड पर निर्भर करती है। इसलिए जांच करना और सिखाना कठिन है।


19
जहाज उस दर्शन पर रवाना हुआ reference_wrapper, नहीं?
स्टीव जेसोप

5
@KerrekSB मुझे डर है कि मैं पीछा नहीं करता। क्या आप "मानक पुस्तकालय के बाकी हिस्सों से" इस तरह के संदर्भात्मक दृश्य वर्गों को पूरी तरह से अलग स्वामित्व शब्दार्थ का विस्तार कर सकते हैं , कृपया? यह मेरे लिए स्पष्ट नहीं है: यह झूलने वाले संदर्भों / बिंदुओं से अलग कैसे है? या सम्मिलन के कारण अमान्य पुनरावृत्तियों (जैसे std :: वेक्टर)? हमारे पास पहले से ही ये मुद्दे हैं, मेरे लिए यह बहुत स्वाभाविक है कि एक गैर-मालिकाना दृष्टिकोण के समान मुद्दे होंगे जैसे गैर-स्वामित्व वाले संकेत / संदर्भ / पुनरावृत्तियाँ हैं।
अली

5
@ अली: जब आप किसी अन्य मानक पुस्तकालय कंटेनर का उपयोग कर रहे हैं, तो आप कंटेनर का उपयोग करने वाले कोड को देखकर कोड की शुद्धता का दावा कर सकते हैं। इसके लिए ऐसा नहीं है string_view। (मैं यह नहीं कह रहा था कि आप कभी भी टूटे हुए कोड को नहीं लिख सकते। बस यह टूटना स्थानीय है ।)
केरेक एसबी

6
मुझे आश्चर्य है कि वे साथ std::rangeसे नहीं गए boost::iterator_range- IMO यह string_view आइडिया से बेहतर है
चार्ल्स सल्विया

19
@nwp: बहुत से लोग और भाषाएं सी + + की भयानक चूक को खारिज करने के लिए आए हैं और सोचते हैं कि "कॉन्स्टेबल" और "अनसेक्ड" डिफ़ॉल्ट होना चाहिए, "म्यूटेबल" और "साझा" स्पष्ट, दुर्लभ अपवाद।
केरेक एसबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.