@einpoklum अपने जवाब में यहाँ क्या है, span
इसे शुरू करने का एक बहुत अच्छा काम करता है । हालाँकि, उनके उत्तर को पढ़ने के बाद भी, नए लोगों के लिए यह आसान है कि वे अभी भी स्ट्रीम-ऑफ़-थिंक प्रश्नों का एक क्रम रखते हैं, जिनका पूरी तरह से उत्तर नहीं दिया गया है, जैसे कि निम्नलिखित:
- कैसे है a
span
C सरणी से भिन्न है? क्यों नहीं बस उन में से एक का उपयोग करें? ऐसा लगता है कि यह आकार के साथ ही उनमें से एक के रूप में अच्छी तरह से जाना जाता है ...
- रुको, यह एक तरह लग रहा है
std::array
, कैसे इससे span
अलग है?
- ओह, यह मुझे याद दिलाता है,
std::vector
एक std::array
बहुत पसंद नहीं है?
- मैं बहुत उलझन में हूँ। :( क्या है
span
?
तो, यहाँ उस पर कुछ अतिरिक्त स्पष्टता है:
मेरे एंकर के प्रत्यक्ष उद्धरण - मेरे नए शब्दों में :
यह क्या है?
ए span<T>
है:
T
स्मृति में कहीं प्रकार के मूल्यों के एक सन्निहित अनुक्रम का एक बहुत हल्का अमूर्त ।
- मूल रूप से सुविधा विधियों के एक समूह के साथ एक एकल संरचना
{ T * ptr; std::size_t length; }
। (सूचना इस से अलग है std::array<>
क्योंकि एक span
तरीकों एक्सेसर सुविधा, के लिए तुलनीय सक्षम बनाता है std::array
एक के माध्यम से, टाइप करने के लिए सूचकT
और प्रकार की लंबाई (तत्वों की संख्या) T
, जबकि std::array
एक वास्तविक कंटेनर जो एक या अधिक रखती है मानों प्रकार के T
।)
- एक गैर-स्वामित्व वाला प्रकार (अर्थात "मान प्रकार" के बजाय "संदर्भ-प्रकार "): यह कभी भी किसी चीज़ का आवंटन नहीं करता है और न ही करता है और स्मार्ट पॉइंटर्स को जीवित नहीं रखता है।
यह पहले एक के रूप में जाना जाता था array_view
और पहले भी के रूप में जाना जाता था array_ref
।
वे बोल्ड पार्ट्स किसी की समझ के लिए महत्वपूर्ण हैं, इसलिए उन्हें याद न करें या उन्हें गलत न समझें! A span
संरचना का C-सरणी नहीं है, न ही यह C-array प्रकार की संरचना है और साथ ही सरणी की T
लंबाई भी है (यह अनिवार्य रूप से std::array
कंटेनर क्या होगा ), NOR यह बिंदुओं की संरचना का सी-सरणी है टाइप करने के T
लिए लंबाई, लेकिन इसके बजाय यह एक एकल संरचना है जिसमें टाइप करने के लिएT
एक एकल पॉइंटर है , और लंबाई , जो सन्निहित मेमोरी ब्लॉक में तत्वों (प्रकार T
)T
इस तरह, एक ही ओवरहेड जो आपने एक का उपयोग करके जोड़ा है की संख्या है जो पॉइंटर को टाइप करने के लिए इंगित करता है! span
पॉइंटर और लंबाई को स्टोर करने के लिए चर हैं, और आपके द्वारा उपयोग किए जाने वाले किसी भी सुविधा एक्सेसरी फ़ंक्शनspan
प्रदान करता है।
यह UNLIKE है std::array<>
क्योंकि std::array<>
वास्तव में पूरे सन्निहित ब्लॉक के लिए स्मृति आवंटित करता है, और यह UNLIKE है std::vector<>
क्योंकि std::vector
मूल रूप से एक std::array
ऐसा है जो गतिशील रूप से बढ़ता है (आमतौर पर आकार में दोगुना) यह हर बार भरता है और आप इसमें कुछ और जोड़ने की कोशिश करते हैं। । एक std::array
आकार में तय हो गई है, और एक span
भी ब्लॉक यह बताते हैं के लिए, यह सिर्फ स्मृति के ब्लॉक करने के लिए अंक, जानता है कि कब तक स्मृति के ब्लॉक है, की स्मृति का प्रबंधन नहीं है जानता है कि क्या डेटा प्रकार एक सी सरणी में है मेमोरी में, और उस सन्निहित मेमोरी में तत्वों के साथ काम करने के लिए सुविधा एक्सेसर फ़ंक्शन प्रदान करता है ।
यह C ++ मानक का हिस्सा है:
std::span
C ++ 20 के रूप में C ++ मानक का हिस्सा है। आप इसके प्रलेखन को यहाँ पढ़ सकते हैं: https://en.cppreference.com/w/cpp/container/span । यह देखने के लिए कि Google का absl::Span<T>(array, length)
C ++ 11 या आज के बाद का उपयोग कैसे करें , नीचे देखें।
सारांश विवरण और मुख्य संदर्भ:
std::span<T, Extent>
( Extent
= "अनुक्रम में तत्वों की संख्या, या std::dynamic_extent
गतिशील यदि" एक अवधि सिर्फ। के अंक स्मृति और उपयोग करने के लिए इसे आसान बना देता है, लेकिन यह प्रबंधित नहीं करता है!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>
(ध्यान दें कि इसका एक निश्चित आकार है N
!):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T>
(स्वचालित रूप से आवश्यक रूप से आकार में बढ़ता है):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
मैं span
C ++ 11 या बाद में आज कैसे उपयोग कर सकता हूं ?
Google ने अपने आंतरिक सी ++ 11 पुस्तकालयों को अपने "एबसील" पुस्तकालय के रूप में खोला है। इस लाइब्रेरी का उद्देश्य C ++ 14 से C ++ 20 और उससे आगे की सुविधाओं को प्रदान करना है जो C ++ 11 और बाद में काम करते हैं, ताकि आप कल की सुविधाओं का उपयोग कर सकें, आज। वे कहते हैं:
C ++ मानक के साथ संगतता
Google ने कई सार विकसित किए हैं जो या तो मैच करते हैं या C ++ 14, C ++ 17, और उससे आगे की विशेषताओं को मिलाते हैं। इन सार के एबसील संस्करणों का उपयोग करने से आप इन सुविधाओं का उपयोग कर सकते हैं, भले ही आपका कोड C ++ 11 दुनिया में जीवन के लिए अभी तक तैयार नहीं है।
यहां कुछ प्रमुख संसाधन और लिंक दिए गए हैं:
- मुख्य साइट: https://abseil.io/
- https://abseil.io/docs/cpp/
- GitHub रिपॉजिटरी: https://github.com/abseil/abseil-cpp
span.h
हेडर और absl::Span<T>(array, length)
टेम्प्लेट क्लास: https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L189
std::span
2017 में प्रस्तावित किया गया था। यह C ++ 17 या C ++ 20 पर लागू होता है। P0122R5, स्पैन भी देखें : वस्तुओं के अनुक्रम के लिए सीमा-सुरक्षित दृश्य । क्या आप वास्तव में उस भाषा को लक्षित करना चाहते हैं? यह कंपाइलर पकड़ने से पहले का साल होगा।