2013-06-03 37 views
6

पहला भाग:std :: startizer_list की अंतर्निहित संरचना क्या है?

std::initializer_list की सी ++ 11 एक बहुत उपयोगी सुविधा है, इसलिए मैं यह कैसे मानक पुस्तकालय में कार्यान्वित किया जाता है सोचा। जो मैंने here पढ़ा है, से संकलक T प्रकार की एक सरणी बनाता है और सूचक को initializer_list<T> पर देता है।

यह भी कहता है कि initializer_list की प्रतिलिपि बनाने से एक ही ऑब्जेक्ट एक ही डेटा का संदर्भ देगा: ऐसा क्यों है? मैं अनुमान लगाया है कि वह या तो:

  • नई initializer_list

दूसरा हिस्सा करने के लिए नए initializer_list

  • डेटा की चाल स्वामित्व के लिए प्रतियां डेटा:

    बस से std::vector रचनाकारों के लिए कई ऑनलाइन संदर्भों में से एक:

    vector (initializer_list<value_type> il, 
        const allocator_type& alloc = allocator_type()); 
    

    (6) प्रारंभकर्ता सूची निर्माता

    Constructs इल में तत्वों में से प्रत्येक की एक प्रति, उसी क्रम में के साथ एक कंटेनर।

    मैं अभी तक इस कदम अर्थ विज्ञान के साथ सहज नहीं हूँ, लेकिन il का डेटा vector में नहीं ले जाया जा सकता है? मुझे std::vector के गहरे कार्यान्वयन से अवगत नहीं है, लेकिन आईआईआरसी यह सादे-पुराने सरणी का उपयोग करता है।

  • +2

    cplusplus.com पर भरोसा न करने के किसी अन्य कारण की तरह लगता है। मानक में डिलविंग, अंततः प्रारंभिक-सूची सीटीओआर में जोड़ी-ऑफ-इटरेटर सीटीओआर को बुलाता है, जो (एम्प्लस निर्माण का उपयोग करके) तत्वों को संभवतः स्थानांतरित कर देगा। – Angew

    +6

    cplusplus.com एक भयानक, भयानक साइट है जो सी ++ समुदाय को नुकसान पहुंचाती है। किसी को इसे होस्ट करने वाले सर्वरों को तोड़ना चाहिए, हार्ड ड्राइव को जला देना चाहिए, उन्हें ठोस में घुमाएं और उन्हें समुद्र के नीचे डुबो दें। –

    +1

    'std :: startizer_list की अंतर्निहित संरचना क्या है?' अच्छे कारण के लिए, आप से दूर सारणी। –

    उत्तर

    12

    std::initializer_list की अंतर्निहित संरचना क्या है?

    अधिकतर, पॉइंटर्स या पॉइंटर और आकार का एक जोड़ी। पैरा सी ++ 11 स्टैंडर्ड की 18.9/2 भी एक (गैर मानक) नोट में यह उल्लेख है:

    प्रकार initializer_list<E> का एक ऑब्जेक्ट प्रकार const E की वस्तुओं की एक सरणी के लिए उपयोग प्रदान करता है। [नोट: पॉइंटर्स या पॉइंटर प्लस की एक जोड़ी initializer_list के लिए स्पष्ट प्रतिनिधित्व होगी। initializer_list 8.5.4 में निर्दिष्ट अनुसार प्रारंभकर्ता सूचियों को लागू करने के लिए उपयोग किया जाता है। initializer list की प्रतिलिपि अंतर्निहित तत्वों की प्रतिलिपि नहीं है। अंत टिप्पणी]

    इसके अलावा:

    मैं अभी तक इस कदम अर्थ विज्ञान के साथ सहज नहीं हूँ, लेकिन il का डेटा वेक्टर में नहीं ले जाया जा सकता है?

    नहीं, आप एक initializer_list के तत्वों से स्थानांतरित कर सकते हैं नहीं है, क्योंकि एक initializer_list के तत्वों अपरिवर्तनीय होने की अपेक्षा की जाती है (पैरा ऊपर उद्धृत का पहला वाक्य देखें)। यही कारण है कि केवल const - योग्य सदस्य कार्य आपको तत्वों तक पहुंच प्रदान करते हैं।

    +1

    ध्यान दें कि तकनीकी रूप से एक निर्माता जैसे 'foo (foo const &&);' एक चालक कन्स्ट्रक्टर है, और वास्तव में कहा जाएगा यदि आपने' std :: move_iterator 'में उपयोग किए गए' std :: startizer_list' के इटरेटर को लपेट लिया है या उपयोग किया जाता है ऐसी कुछ चालबाजी। इस तरह का एक कन्स्ट्रक्टर शायद ही कभी कुछ भी उपयोगी कर सकता है (या मानक * प्रति * कन्स्ट्रक्टर क्या कर सकता है उससे भिन्न) हालांकि –

    +0

    @ ल्यूकडैंटन: 'foo (foo const &&)' ... ew ... :) लेकिन हाँ , तकनीकी रूप से आप सही हैं। अभी भी इस तथ्य को नहीं बदलेगा कि 'startizer_list' के तत्व अपरिवर्तनीय होने के लिए हैं, ताकि "कन्स्ट्रक्टर को स्थानांतरित करने" को अपरिभाषित व्यवहार के बिना कुछ भी स्थानांतरित करने की अनुमति नहीं दी जाएगी। –

    +0

    @AndyProwl: प्रारंभकर्ता सूची में वेरिएबल संदर्भ भी हो सकते हैं। उस स्थिति में एक चाल ctor निर्दिष्ट तत्व के डेटा को ले जाता है। तो हाँ, सूची स्वयं अपरिवर्तनीय है (हमेशा एक ही संदर्भ में रहती है), लेकिन चाल सीटीआर उपयोगी हो सकता है। –

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