क्या एक std::pair
और std::tuple
केवल दो सदस्यों के साथ अंतर है ? (स्पष्ट है कि std::pair
दो और केवल दो सदस्यों की आवश्यकता है और tuple
कम या ज्यादा हो सकती है ...)
जवाबों:
कुछ अंतर हैं:
std::tuple
मानक-लेआउट द्वारा कभी नहीं हो सकता (कम से कम, यह मानक द्वारा आवश्यक नहीं है )। हर std::pair<T, Y>
यदि दोनों मानक लेआउट है T
और Y
मानक लेआउट कर रहे हैं।
एक pair
से अधिक की सामग्री प्राप्त करना थोड़ा आसान है tuple
। आपको tuple
मामले में एक फ़ंक्शन कॉल का उपयोग करना होगा , जबकि pair
मामला सिर्फ एक सदस्य क्षेत्र है।
इसके बारे में बस इतना ही।
std::map
का उपयोग करता है std::pair<const Key,T>
के रूप में value_type
सी में भी ++ 11। वास्तव में टुपल्स का उपयोग कहां किया जाता है std::map
?
std::map
।
यह एक बहुत देर से जवाब है लेकिन ध्यान दें, क्योंकि std::pair
सदस्य चर के साथ परिभाषित किया गया है, इसका आकार खाली आधार वर्ग अनुकूलन का उपयोग करके अनुकूलित नहीं किया जा सकता है ( first
और second
अलग-अलग पते पर कब्जा करना चाहिए, भले ही एक या दोनों एक खाली वर्ग हो)। यह जो भी संरेखण आवश्यकताओं के द्वारा exacerbated second_type
है, इसलिए सबसे खराब स्थिति में जिसके परिणामस्वरूप std::pair
मूल रूप से दो बार आकार की आवश्यकता होगी।
std::tuple
केवल सहायक कार्यों के माध्यम से पहुंच की अनुमति देता है, इसलिए यह संभव है कि किसी भी प्रकार से प्राप्त किया जाए यदि एक या दूसरे खाली है, तो ओवरहेड पर बचत हो सकती है। जीसीसी का कार्यान्वयन, बहुत कम से कम, निश्चित रूप से ऐसा करता है ... आप इसे सत्यापित करने के लिए हेडर के माध्यम से प्रहार कर सकते हैं लेकिन सबूत के रूप में यह भी है।
[[no_unique_address]]
को std::pair
नुकसान को दूर करना चाहिए ।
एक std::tuple
नाम लंबा है (एक अतिरिक्त चरित्र)। उन पात्रों में से अधिकांश दाहिने हाथ से टाइप किए जाते हैं, इसलिए अधिकांश लोगों के लिए टाइप करना आसान होता है।
उस ने कहा, std::pair
केवल दो मूल्य हो सकते हैं - शून्य नहीं, एक, तीन या अधिक। दो मान। हालाँकि, टुपल का मानों की संख्या पर कोई शब्दार्थ सीमा नहीं है। एक std::pair
है, इसलिए, एक और अधिक सटीक, टाइप सुरक्षित प्रकार यदि आप वास्तव में मूल्यों की एक जोड़ी निर्दिष्ट करना चाहते हैं उपयोग करने के लिए है।
std::tuple<>
है भी टाइप सुरक्षित (? यह कैसे नहीं हो सकता है), और 2
कोई से शब्दार्थ अलग है pair
।
इसके लायक क्या है, मुझे लगता है कि GDB आउटपुट का std :: tuple होना कहीं अधिक कठिन है। जाहिर है अगर आपको 2 से अधिक मूल्यों की आवश्यकता है, तो std :: pair काम नहीं करेगा, लेकिन मैं इसे संरचना के पक्ष में एक बिंदु मानता हूं।
std::get<0>(tupleName)
एक गटर में सकल रेखा लपेटता हूं ; GetX()
पढ़ने और कम करने के लिए बहुत आसान है। इसका एक छोटा सा नुकसान है कि अगर आप इसे एक ऐसी const
विधि बनाना भूल जाते हैं जो कोई व्यक्ति इस तरह बेवकूफ बना सकता है GetX() = 20;
:।
.first
और.second
आसान हैं, वे एक कोड परिवर्तन में एक तीसरे (या अधिक) सदस्य (यदि आवश्यक हैं) की मदद नहीं करते हैं। मैंने देखा है कि मैंstd::get
किसी भी गेट्स में इस बात की परवाह किए बिना इस्तेमाल कर रहा हूं कि मुझे सब कुछ बदलने की जरूरत नहीं है, बस डेटाटाइप औरmake_pair
कॉल करने के लिए कोई भीmake_tuple
कॉल।