क्या एक 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कॉल।