वैकल्पिक तत्व के साथ जोड़े के C ++ 17 वेक्टर को इनिशियलाइज़ कैसे करें


34

सी ++ 17 में, आप एक वैकल्पिक तत्व के साथ जोड़े (या ट्यूपल्स) के वेक्टर को कैसे घोषित और आरंभ करते हैं?

    std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
                                                           {2, false}, 
                                                           {3, nullptr}};

मेरे पास एक जोड़ा है जहां दूसरा तत्व अशक्त / वैकल्पिक हो सकता है।


1
std::piecewise_constructदिलचस्प विकल्प भी प्रदान कर सकते हैं।
मार्क ग्लिससे


@JulienLopez यह असाइनमेंट के बारे में बात कर रहा है।
एलएफ

@LF यह वही सवाल है जब आप अप्रासंगिक संदर्भ को हटाते हैं: आप एक खाली वैकल्पिक कैसे बनाते हैं?
जूलियन लोपेज

1
@JulienLopez C ++ में, प्रारंभ और असाइनमेंट सामान्य रूप से बहुत अलग हैं। सिर्फ इसलिए कि दो प्रश्नों के अतिव्यापी समाधान होने का मतलब यह नहीं है कि वे समान हैं। विशेष रूप से, ध्यान दें कि आप resetयहाँ उपयोग नहीं करना चाहते हैं।
एलएफ

जवाबों:


49

आप के std::nulloptबजाय के लिए देख रहे हैं nullptr

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };

3
(हॉट नेटवर्क क्वेश्चन लिंक से यहां आकर) क्या C ++ कोड हमेशा std::इस तरह स्पैम होता है ? सिर्फ using std::vectorऔर सिर्फ दोस्त ही क्यों , क्या आप सिर्फ लिख सकते हैं vector<pair<int, optional<bool>>? और अधिक पवित्र तरीके से पढ़ता है
अलेक्जेंडर - मोनिका

17
@ अलेक्जेंडर-रिंस्टोमोनिका "अधिक तरीके से पढ़ता है" व्यक्तिपरक है। पठनीयता तर्क का दूसरा पहलू कुछ इस तरह है: मैं सब आंकड़ा करने के लिए फ़ाइल के शीर्ष करने के लिए रास्ता वापस बाहर जाना है नहीं करना चाहती जो विशेष रूप से vector , pair, optional, आदि मैं इस पंक्ति में उपयोग कर रहा हूँ। नाम स्थान इनलाइन सहित मुझे स्पष्ट रूप से बताता है कि यह कार्य कहां से आता है और यह क्या करता है; लाइन स्व-निहित है। यह बड़ी परियोजनाओं के लिए विशेष रूप से सच है (क्योंकि यह नामस्थान संघर्ष से पूरी तरह से बचा जाता है), लेकिन संक्षिप्त कोड उदाहरणों के लिए भी उपयोगी है।
probably_someone

3
@ अलेक्जेंडर-रिनस्टोमोनिका यह तर्क ठीक है यदि आपके पास किसी भी कोड का पूर्ण पर्यवेक्षण और नियंत्रण है जो आपने अभी-अभी लिखे कोड का उपयोग करता है (क्योंकि तब आप ठीक से जानते हैं जब "बंद होने की स्थिति में टकराव होता है")। लेकिन अगर आप कुछ ऐसा कर रहे हैं, उदाहरण के लिए, एक पुस्तकालय या एक एपीआई विकसित करना जो अन्य डेवलपर्स के झुंड द्वारा उपयोग के लिए है, तो आप इस तरह की टक्कर होने पर पता लगाने के लिए हर एक उपयोग की निगरानी नहीं कर सकते। यह आम तौर पर उस (अपेक्षाकृत आम) मामले में बेहतर है कि पूर्व-खाली टकराव हो, बल्कि उन्हें ठीक करने के बाद ही किसी ने शिकायत की कि आपका उत्पाद टूट गया है।
probably_someone

3
@ अलेक्जेंडर-रिंस्टोमोनिका निम्नलिखित में से आपको तुरंत कौन सा एहसास होता है std? arg, count, find,size
वामो

4
@ मेरे लिए, अलेक्जेंडर-रिंस्टोमोनिका, std::पूरी तरह से असहनीय है। यह अलग होगा यदि नाम स्थान का नाम अधिक लंबा था।
कार्स्टन एस

24

या साधारण उपयोग डिफ़ॉल्ट निर्माण:

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};

6
जबकि यह काम करता है, std::nulloptबेहतर इरादे का संचार करता है ।
विलीहम टटलैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.