एसटीडी :: जोड़ी और एसटीडी के बीच अंतर :: केवल दो सदस्यों के साथ टपल?


92

क्या एक std::pairऔर std::tupleकेवल दो सदस्यों के साथ अंतर है ? (स्पष्ट है कि std::pairदो और केवल दो सदस्यों की आवश्यकता है और tupleकम या ज्यादा हो सकती है ...)

जवाबों:


86

कुछ अंतर हैं:

  1. std::tupleमानक-लेआउट द्वारा कभी नहीं हो सकता (कम से कम, यह मानक द्वारा आवश्यक नहीं है )। हर std::pair<T, Y>यदि दोनों मानक लेआउट है Tऔर Yमानक लेआउट कर रहे हैं।

  2. एक pairसे अधिक की सामग्री प्राप्त करना थोड़ा आसान है tuple। आपको tupleमामले में एक फ़ंक्शन कॉल का उपयोग करना होगा , जबकि pairमामला सिर्फ एक सदस्य क्षेत्र है।

इसके बारे में बस इतना ही।


5
"टपल की तुलना में जोड़े से डेटा प्राप्त करना थोड़ा आसान है। थोड़ा सा।" मैंने ध्यान दिया। : P हालांकि .firstऔर .secondआसान हैं, वे एक कोड परिवर्तन में एक तीसरे (या अधिक) सदस्य (यदि आवश्यक हैं) की मदद नहीं करते हैं। मैंने देखा है कि मैं std::getकिसी भी गेट्स में इस बात की परवाह किए बिना इस्तेमाल कर रहा हूं कि मुझे सब कुछ बदलने की जरूरत नहीं है, बस डेटाटाइप और make_pairकॉल करने के लिए कोई भी make_tupleकॉल।
केसी

ऐसा नहीं है कि प्रतीत होता है std::mapका उपयोग करता है std::pair<const Key,T>के रूप में value_typeसी में भी ++ 11। वास्तव में टुपल्स का उपयोग कहां किया जाता है std::map?
nknight

@nknight: ... मुझे नहीं पता कि मैंने ऐसा क्यों कहा। या इसके बजाय मेरे कहने का मतलब क्या था std::map
निकोल बोलस

1
@ यक: उम, आई प्रेस "।" और मेरा आईडीई सदस्यों की एक सूची लाता है। मुझे नहीं लगा कि लोगों को उस वर्तनी की आवश्यकता थी।
निकोल बोलस 15

2
मुझे आश्चर्य है कि अगर c ++ 17 में संरचित बाध्यकारी इस उत्तर के 1 और 2 दोनों बिंदुओं को पहले ही अमान्य कर देता है? यदि हां, तो कृपया इसका एक c + 17 संस्करण भी जोड़ें।
सैंडथॉर्न

29

यह एक बहुत देर से जवाब है लेकिन ध्यान दें, क्योंकि std::pairसदस्य चर के साथ परिभाषित किया गया है, इसका आकार खाली आधार वर्ग अनुकूलन का उपयोग करके अनुकूलित नहीं किया जा सकता है ( firstऔर secondअलग-अलग पते पर कब्जा करना चाहिए, भले ही एक या दोनों एक खाली वर्ग हो)। यह जो भी संरेखण आवश्यकताओं के द्वारा exacerbated second_typeहै, इसलिए सबसे खराब स्थिति में जिसके परिणामस्वरूप std::pairमूल रूप से दो बार आकार की आवश्यकता होगी।

std::tupleकेवल सहायक कार्यों के माध्यम से पहुंच की अनुमति देता है, इसलिए यह संभव है कि किसी भी प्रकार से प्राप्त किया जाए यदि एक या दूसरे खाली है, तो ओवरहेड पर बचत हो सकती है। जीसीसी का कार्यान्वयन, बहुत कम से कम, निश्चित रूप से ऐसा करता है ... आप इसे सत्यापित करने के लिए हेडर के माध्यम से प्रहार कर सकते हैं लेकिन सबूत के रूप में यह भी है।


4
बेशक, C ++ 20[[no_unique_address]] को std::pairनुकसान को दूर करना चाहिए ।
डेडुप्लिकेटर

"std :: tuple केवल सहायक कार्यों के माध्यम से पहुंच की अनुमति देता है", या C ++ 17 संरचित बाइंडिंग। दुख की बात है कि इतने सारे उचित C ++ उत्तर इन दिनों इतनी जल्दी आउट ऑफ़ डेट हो गए हैं। :-(
cosimo193

29

एक std::tupleनाम लंबा है (एक अतिरिक्त चरित्र)। उन पात्रों में से अधिकांश दाहिने हाथ से टाइप किए जाते हैं, इसलिए अधिकांश लोगों के लिए टाइप करना आसान होता है।

उस ने कहा, std::pairकेवल दो मूल्य हो सकते हैं - शून्य नहीं, एक, तीन या अधिक। दो मान। हालाँकि, टुपल का मानों की संख्या पर कोई शब्दार्थ सीमा नहीं है। एक std::pairहै, इसलिए, एक और अधिक सटीक, टाइप सुरक्षित प्रकार यदि आप वास्तव में मूल्यों की एक जोड़ी निर्दिष्ट करना चाहते हैं उपयोग करने के लिए है।


20
जबरदस्त हंसी! शानदार है कि आप पर विचार करें कि यह कैसे टाइप किया जाता है! मैं यह बताना चाहूंगा कि मैं 'टपल' की तुलना में शायद 20% अधिक तेजी से 'जोड़ी' टाइप कर रहा हूं। ऐसा इसलिए है क्योंकि मेरे हाथ प्रत्येक वर्ण को वैकल्पिक रूप से टाइप करते हैं, अर्थात। आरएचएस: पी, एलएचएस: ए, आरएचएस: आई, एलएचएस: आर। कम से कम मेरे लिए मुझे ऐसा करना आसान लगता है! - लेकिन आप अभी भी +1 करते हैं!
रिचर्ड कॉर्डन

15
" एक std :: जोड़ी, इसलिए, एक अधिक सटीक, सुरक्षित प्रकार का उपयोग करने के लिए है यदि आप वास्तव में मूल्यों की एक जोड़ी निर्दिष्ट करना चाहते हैं। " यह अधिक प्रकार-सुरक्षित या "सटीक" नहीं है, यह केवल (यकीनन) संकेतों का इरादा है अधिक सीधे।
ildjarn

1
@Arafangion: std::tuple<>है भी टाइप सुरक्षित (? यह कैसे नहीं हो सकता है), और 2कोई से शब्दार्थ अलग है pair
ildjarn

1
", एक std :: जोड़ी, इसलिए, उपयोग करने के लिए एक अधिक सटीक, सुरक्षित प्रकार है " और मुझे लगता है कि कोई भी अंग्रेजी वक्ता पूरी तरह से पर्याय के रूप में 'जोड़ी' और 'दो' के बारे में सोचेगा। : -]
ildjarn

5
@ मिल्डजम: हम यहां बालों को विभाजित कर रहे हैं, लेकिन नहीं, वे पूरी तरह से पर्याय नहीं हैं । जब आप "दो जूते" कहते हैं, तो क्या आपका मतलब है "दो जूते, जो अच्छी तरह से दोनों बाएं जूते हो सकते हैं", या क्या आप का मतलब है "एक जोड़ी जूते" (जिनमें से एक हमेशा छोड़ा जाता है, और दूसरा जो हमेशा सही होता है) ?
अराफंगियन

9

ध्यान दें कि C ++ 17 के साथ, एक ही इंटरफ़ेस का उपयोग दो तत्वों से डेटा को पढ़ने के लिए कर सकते हैं।

auto [a, b] = FunctionToReturnPairOrTuple();

उपयोग करने की कोई आवश्यकता नहीं है get<>:)


3

इसके लायक क्या है, मुझे लगता है कि GDB आउटपुट का std :: tuple होना कहीं अधिक कठिन है। जाहिर है अगर आपको 2 से अधिक मूल्यों की आवश्यकता है, तो std :: pair काम नहीं करेगा, लेकिन मैं इसे संरचना के पक्ष में एक बिंदु मानता हूं।


यही कारण है कि जब मैंने कक्षाओं में उनका उपयोग किया तो मैं std::get<0>(tupleName)एक गटर में सकल रेखा लपेटता हूं ; GetX()पढ़ने और कम करने के लिए बहुत आसान है। इसका एक छोटा सा नुकसान है कि अगर आप इसे एक ऐसी constविधि बनाना भूल जाते हैं जो कोई व्यक्ति इस तरह बेवकूफ बना सकता है GetX() = 20;:।
केसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.