C ++ में टुपल्स का उपयोग अधिक सामान्य क्यों नहीं है?


124

किसी को भी C ++ में टुपल्स का उपयोग करना प्रतीत नहीं होता है, या तो बूस्ट टपल लाइब्रेरी या लिए मानक पुस्तकालय ? मैंने बहुत सी सी + + कोड पढ़ा है, और बहुत कम ही मुझे टुपल्स का उपयोग दिखाई देता है, लेकिन मैं अक्सर बहुत सारे स्थान देखता हूं जहां ट्यूपल्स कई समस्याओं को हल करेंगे (आमतौर पर फ़ंक्शन से कई मान लौटाते हैं)।

Tuples आपको इस तरह की सभी शांत चीजें करने की अनुमति देता है:

tie(a,b) = make_tuple(b,a); //swap a and b

यह निश्चित रूप से इस से बेहतर है:

temp=a;
a=b;
b=temp;

बेशक आप हमेशा ऐसा कर सकते हैं:

swap(a,b);

लेकिन क्या होगा अगर आप तीन मूल्यों को घुमाना चाहते हैं? आप इसे टुपल्स के साथ कर सकते हैं:

tie(a,b,c) = make_tuple(b,c,a);

ट्यूपल्स एक फ़ंक्शन से कई वेरिएबल को वापस करना बहुत आसान बनाते हैं, जो कि स्वैपिंग मानों की तुलना में संभवतः बहुत अधिक सामान्य मामला है। मान वापस करने के लिए संदर्भों का उपयोग करना निश्चित रूप से बहुत सुरुचिपूर्ण नहीं है।

वहाँ tuples कि मैं के बारे में नहीं सोच रहा हूँ के लिए कोई बड़ी कमियां हैं? यदि नहीं, तो उनका उपयोग शायद ही कभी क्यों किया जाता है? क्या वे धीमे हैं? या यह सिर्फ इतना है कि लोगों को उनकी आदत नहीं है? क्या टुपल्स का उपयोग करना एक अच्छा विचार है?


17
+1 चतुर टपल स्वैपिंग ट्रिक के लिए :)
kizzx2

10
a = a ^ b; b = a ^ b; a = a ^ b;
गेरार्डो मारसेट

3
IMO tuples कमजोर टाइपिंग भाषाओं या उन भाषाओं में सुविधाजनक है जिनमें वे मूल संरचनाएं हैं। उदाहरण के लिए पायथन या पीएचपी में वे जीवन को आसान बनाते हैं, जबकि C ++ में बहुत अधिक टाइपिंग (इसे टेम्पलेट से निर्माण करना) और बहुत कम लाभ हैं।
दिनांक

4
ओपी के लिए एक टिप्पणी: मुझे लगता है कि वर्तमान स्वीकृत उत्तर पहले से ही तथ्यात्मक रूप से गलत होने के बिंदु पर आंका गया है। आप स्वीकृत उत्तर की पसंद पर पुनर्विचार करना चाह सकते हैं।
ulidtko

8
@GerardoMarset क्या आप गंभीर हैं?
थिसेंट

जवाबों:


43

क्योंकि यह अभी तक मानक नहीं है। कुछ भी गैर-मानक में बहुत अधिक बाधा है। बूस्ट के टुकड़े लोकप्रिय हो गए हैं क्योंकि प्रोग्रामर उनके लिए संघर्ष कर रहे थे। (हैश_मैप लीप टू माइंड)। लेकिन जब तक यह आसान है, यह इतनी भारी और स्पष्ट जीत नहीं है कि लोग इससे परेशान हों।


1
लोग बूस्ट के अन्य हिस्सों का उपयोग पागलों की तरह करने लगते हैं। हालांकि निश्चित रूप से हैश मैप ट्यूपल की तुलना में सामान्य रूप से बहुत अधिक उपयोगी होते हैं।
ज़ीफ्रे

मैं नहीं जानता कि आप क्या देख रहे हैं, की बारीकियों को जानते हैं, लेकिन मैं अनुमान लगा रहा हूं कि लोग पागलों की तरह उपयोग कर रहे हैं, वे ऐसी विशेषताएं हैं जो वे वास्तव में चाहते थे। इस प्रकार (फिर से अनुमान लगाते हुए) हैश मैप की लोकप्रियता, गिने हुए पॉइंटर और पसंद। टपल आसान है, लेकिन यह ऐसा कुछ नहीं है जो एक छेद को भरने के लिए बाहर निकलता है। अदायगी स्पष्ट नहीं है। आपको कितनी बार एन वस्तुओं को घुमाने की आवश्यकता है? (जैसा कि मनमाने ढंग से लंबे वैक्टर को घुमाने की जरूरत के विपरीत)। और लोगों को संदर्भ द्वारा या तो वापसी मूल्यों को पारित करने के लिए उपयोग किया जाता है, या छोटी कक्षाओं या संरचनाओं को वापस किया जाता है।
एलन दे स्मेट

20
यह वास्तव में C ++ 11 मानक का एक हिस्सा है: en.cppreference.com/w/cpp/utility/tuple
रोमन सूसी

124

एक सनकी जवाब यह है कि कई लोग C ++ में प्रोग्राम करते हैं, लेकिन उच्च स्तर की कार्यक्षमता को नहीं समझते और / या उपयोग करते हैं। कभी-कभी ऐसा इसलिए होता है क्योंकि उन्हें अनुमति नहीं होती है, लेकिन कई लोग बस कोशिश नहीं करते (या यहां तक ​​कि समझते हैं)।

एक गैर-बूस्ट उदाहरण के रूप में: कितने लोग कार्यक्षमता में पाए गए उपयोग करते हैं <algorithm>?

दूसरे शब्दों में, कई C ++ प्रोग्रामर C ++ कंपाइलर का उपयोग करके केवल C प्रोग्रामर हैं, और शायद std::vectorऔर std::list। यही कारण है कि इसका उपयोग boost::tupleअधिक सामान्य नहीं है।


18
मेरे से -1 क्योंकि C ++ प्रोग्रामर उतने गूंगे नहीं हैं, क्योंकि यह जवाब उन्हें अच्छा लगता है।
user541686

5
@ मेहरदाद ने C ++ कोड के बहुत से माध्यमों को देखा, दोनों वाणिज्यिक और नहीं, C ++ सामग्री के टन को पढ़ते हुए, मुझे लगता है कि यह कहना काफी सुरक्षित है कि "C ++" डेवलपर्स का एक बहुत बड़ा हिस्सा सिर्फ सी डेवलपर्स हैं जो शुद्ध नहीं मिल सके। सी संकलक। उदाहरण के लिए, टेम्प्लेट अधिकांश सामग्रियों से लगभग पूरी तरह से गायब हैं (कुछ मैंने बहुत प्यार करना सीखा है)। अजीब मैक्रो हैक आम हैं और नेमस्पेस गंभीर रूप से अप्रयुक्त हैं।
स्पष्ट

5
निरर्थक उत्तर। अगर किसी को उनकी जरूरत है, तो वे उन्हें पकड़ लेंगे। उनकी जरूरत नहीं है; इसलिए उनका उपयोग नहीं किया जाता है। यह कहना कि उनका उपयोग नहीं किया जाता है क्योंकि वे आसानी से समझ में नहीं आते हैं बुरा है।
माइकल चौरडकिस

9
@ मिचेल नॉनसेंस की टिप्पणी। एक बार आपको किसी भाषा का ट्यूरिंग पूर्ण उपसमूह मिल जाने के बाद प्रोग्रामिंग में कुछ भी आवश्यक नहीं है । उपयोग की कमी निश्चित रूप से इसका मतलब यह नहीं है कि हर कोई उच्च स्तर के सी ++ निर्माण को समझता है और उनका उपयोग नहीं करने का विकल्प चुनता है।
ट्रे जैक्सन

4
Tbh I NEVER को कभी भी std :: tuple के बाहर varadic template metaprogramming की आवश्यकता थी। जीवन का कोई मतलब नहीं था, जहां मैं उदास चेहरे के साथ बैठी थी, "अगर केवल मेरे पास ही वे ट्यूपल्स थे"। वास्तव में जब मैं टुपल्स को देखता हूं तो मुझे लगता है कि "किसी को क्या नर्क की आवश्यकता होगी (मैं अपने आप को समझदार नहीं समझूंगा")। मेटा-प्रोग्रामिंग के बाहर के लोग उन्हें "बेनामी संरचना" के रूप में उपयोग करने लगते हैं जो बहुत बदसूरत है और उनके सिर में कोड की गुणवत्ता और रखरखाव की मजबूत अनुपस्थिति को इंगित करता है।
थिसेंट

23

C ++ tuple सिंटैक्स काफी अधिक वर्बोज़ हो सकता है, जो अधिकांश लोग पसंद करेंगे।

विचार करें:

typedef boost::tuple<MyClass1,MyClass2,MyClass3> MyTuple;

इसलिए यदि आप ट्यूपल्स का व्यापक उपयोग करना चाहते हैं, तो आपको या तो हर जगह टुप्ल टायडेफ़्स मिलते हैं या आपको हर जगह गुस्सा करने वाले लंबे प्रकार के नाम मिलते हैं। मुझे टुपल्स पसंद हैं। आवश्यकता पड़ने पर मैं उनका उपयोग करता हूं। लेकिन यह आमतौर पर कुछ स्थितियों तक सीमित होता है, जैसे कि एन-तत्व इंडेक्स या रेंज मल्टीपर्स जोड़े को टाई करने के लिए मल्टीमैप का उपयोग करना। और यह आमतौर पर बहुत सीमित दायरे में होता है।

हास्केल या पायथन जैसी किसी चीज़ की तुलना में यह बहुत ही बदसूरत और हैकिंग है। जब C ++ 0x यहाँ हो जाता है और हमें 'auto' कीवर्ड ट्यूल मिलता है, तो यह बहुत अधिक आकर्षक लगने लगेगा।

ट्यूपल्स की उपयोगिता उन्हें घोषित, पैक और अनपैक करने के लिए आवश्यक कीस्ट्रोक्स की संख्या के विपरीत आनुपातिक है।


ज्यादातर लोग "नेमस्पेस बूस्ट का उपयोग" करेंगे; और बढ़ावा देने के लिए नहीं है ::। मुझे नहीं लगता कि टाइपिंग एक समस्या है। उन्होंने कहा, मुझे लगता है कि आपके पास एक बिंदु है। ऑटो बहुत अधिक लोगों को ट्यूपल्स का उपयोग करना शुरू कर सकता है।
ज़िफरे

2
@Zifre: समस्या यह है कि आपको शीर्षलेख फ़ाइल के भीतर "नाम स्थान X का उपयोग" नहीं करना चाहिए, क्योंकि यह नामस्थान प्रदूषण को बाध्य करता है और नामस्थान को नष्ट कर देता है।
श्री फूज

1
आह, हाँ, मैं हेडर के बारे में भूल जाता हूं। लेकिन प्रोग्राम कोड के अंदर, आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। और एक बार हमारे पास C ++ 0x होने के बाद, हम ऑटो का उपयोग कर सकते हैं जो बहुत सारे टाइपिंग को खत्म कर देना चाहिए।
ज़िफरे

19
यह सिर्फ मैं हूँ? मुझे नहीं लगता कि "बढ़ावा ::" के 7 वर्णों को टाइप करने से वह बचा रहा है, बल्कि वह अन्य 33 वर्णों का उल्लेख कर रहा है । यह एक बहुत वर्ग नाम टाइपिंग की एक बिल्ली है, खासकर अगर उन, भी नाम स्थान scoped हैं। बूस्ट लें :: tuple <std :: string, std :: set <std :: string>, std :: वेक्टर <My :: Scoped :: LongishTypeName>> एक हास्यास्पद उदाहरण के रूप में।
ओगरे Psalm33

10

मेरे लिए, यह आदत है, हाथ नीचे करना: ट्यूपल मेरे लिए कोई नई समस्या हल नहीं करते हैं, बस कुछ मैं पहले से ही ठीक से संभाल सकता हूं। स्वैपिंग मान अभी भी पुराने जमाने के तरीके को आसान लगता है - और, इससे भी महत्वपूर्ण बात यह है कि मैं वास्तव में यह नहीं सोचता कि कैसे "बेहतर" स्वैप किया जाए। यह काफी अच्छा है, जैसा है।

व्यक्तिगत रूप से, मुझे नहीं लगता कि कई मूल्यों को लौटाने के लिए ट्यूपल एक महान समाधान हैं - structएस के लिए नौकरी की तरह लगता है ।


4
'मैं वास्तव में "बेहतर" स्वैप करने के बारे में नहीं सोचता।' '- जब मैं कोड लिखता हूं, तो मैं बग लिखता हूं। कोड की जटिलता को कम करने से मैं लिखने वाले कीड़ों की संख्या कम कर देता हूं। मुझे बार-बार वही कीड़े पैदा करने से नफरत है। हां, मुझे लगता है कि <हड़ताल> स्वैप </> कोड बेहतर कैसे करें । कम चलने वाले भाग (LOC, अस्थायी चर, पहचानकर्ता गलत करने के लिए), अधिक पठनीय कोड; अच्छा कोड।
सेह

इस बात से सहमत। ऑटो-पॉइंटर या स्मार्ट पॉइंटर में लिपटा एक वर्ग टाइप-सेव है। मैंने एक बार ट्यूपल्स का उपयोग किया है, लेकिन फिर कक्षाओं का उपयोग करके कोड को फिर से लिखा। retValue.state, RetValue.get <0> () की तुलना में अधिक स्पष्ट है।
वैलेंटाइन हेनित्ज

1
@sehe: बेहतर, अधिक पठनीय कोड लिखना मेरा लक्ष्य है। अधिक प्रकार के सिंटैक्स को जोड़ना एक लागत है, और मुझे विश्वास नहीं है कि "बेहतर स्वैपिंग" आपके द्वारा पढ़ी गई कोड की प्रत्येक पंक्ति के लिए और भी अधिक प्रकार के सिंटैक्स के बारे में सोचने के मानसिक ओवरहेड को सही ठहराता है।
ओज्रेक

8

लेकिन क्या होगा अगर आप तीन मूल्यों को घुमाना चाहते हैं?

swap(a,b);
swap(b,c);  // I knew those permutation theory lectures would come in handy.

ठीक है, इसलिए 4 आदि मूल्यों के साथ, अंततः n-tuple n-1 स्वैप की तुलना में कम कोड बन जाता है। और डिफ़ॉल्ट स्वैप के साथ यह 4 असाइनमेंट के बजाय 4 कार्य करता है यदि आप स्वयं तीन-चक्र टेम्पलेट लागू करते हैं, तो मुझे उम्मीद है कि कंपाइलर सरल प्रकारों के लिए हल करेगा।

आप उन परिदृश्यों के साथ आ सकते हैं जहाँ स्वैप अनुचित या अनुचित हैं, उदाहरण के लिए:

tie(a,b,c) = make_tuple(b*c,a*c,a*b);

थोडा अजीब है।

बिंदु, हालांकि, सबसे सामान्य स्थितियों से निपटने के ज्ञात तरीके हैं जो ट्यूपल्स के लिए अच्छे हैं, और इसलिए ट्यूपल्स को लेने के लिए कोई महान आग्रह नहीं है। अगर और कुछ नहीं, मुझे विश्वास नहीं है कि:

tie(a,b,c) = make_tuple(b,c,a);

6 प्रतियाँ नहीं करता है, जिससे यह कुछ प्रकारों के लिए पूरी तरह से अनुपयुक्त हो जाता है (संग्रह सबसे स्पष्ट है)। मुझे यह समझाने के लिए स्वतंत्र महसूस करें कि ट्यूपल्स "बड़े" प्रकारों के लिए एक अच्छा विचार है, यह कहकर ऐसा नहीं है :-)

एकाधिक मानों को लौटाने के लिए, यदि मान असंगत प्रकार के हैं, तो ट्यूपल्स सही हैं, लेकिन कुछ लोग उन्हें पसंद नहीं करते हैं यदि कॉलर के लिए उन्हें गलत क्रम में लाना संभव है। कुछ लोगों को कई रिटर्न मान बिल्कुल पसंद नहीं हैं, और उन्हें आसान बनाकर उनके उपयोग को प्रोत्साहित नहीं करना चाहते हैं। कुछ लोग सिर्फ और बाहर के मापदंडों के लिए नामित संरचनाओं को पसंद करते हैं, और शायद ट्यूपल्स का उपयोग करने के लिए बेसबॉल बैट के साथ राजी नहीं हो सकते हैं। स्वाद का कोई हिसाब नहीं।


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

पता है कि आप ट्यूपल्स का उपयोग क्यों करते हैं (और मुझे पता है कि अगर अवसर आया तो मैं उनका उपयोग क्यों करूंगा, हालांकि मुझे नहीं लगता कि यह कभी भी है)। मैं अनुमान लगा रहा हूं कि अन्य लोग उनका उपयोग क्यों नहीं करते, भले ही वे उनके बारे में जानते हों। उदाहरण के लिए, क्योंकि वे "आउट परमेस से बुराई करते हैं" से असहमत हैं ...
स्टीव जेसप

क्या आप जानते हैं कि अगर हम "टाई (ए, बी, सी) = मेक_टुपल (बी, सी, ए) को बदल सकते हैं;" "टाई (ए, बी, सी) = टाई (बी, सी, ए);" ?
दोपहर

2
एक टाई (अच्छी तरह से, एक तकनीकी रूप से) एक ट्यूपल है जिसे गैर-कॉन्स्टेंस संदर्भों के साथ बनाया गया है। मुझे बढ़ावा देने वाले दस्तावेज़ नहीं मिल रहे हैं जो कहते हैं कि ऑपरेटर क्या गारंटी देता है = और टाई / ट्यूपल के लिए कॉपी निर्माता जब संदर्भ में से कुछ को एक ही संदर्भित करता है। लेकिन आपको यह जानना जरूरी है। ऑपरेटर का एक भोली कार्यान्वयन = स्पष्ट रूप से बहुत गलत हो सकता है ...
स्टीव जेसप

1
@Steve: और चूंकि संबंध सभी प्रतियों को रोकने के बारे में हैं (उन्हें गैर-प्रतिलिपि योग्य प्रकारों के लिए काम करना चाहिए; ध्यान दें कि एलएचएस पूरी तरह से कुछ और हो सकता है) वास्तव में यह सब बहुत गलत होना चाहिए (गैर-पीओडी वर्ग वस्तुओं के बारे में सोचें)। जरा कल्पना करें कि आप टेम्पों का उपयोग किए बिना एक ही तर्क कैसे लिखेंगे।
सेह

7

जैसा कि कई लोगों ने बताया, ट्यूपल अन्य विशेषताओं के समान उपयोगी नहीं हैं।

  1. स्वैपिंग और घूर्णन नौटंकी केवल नौटंकी हैं। वे उन लोगों को पूरी तरह से भ्रमित कर रहे हैं जिन्होंने उन्हें पहले नहीं देखा है, और चूंकि यह बहुत ज्यादा है, इसलिए ये नौटंकी सिर्फ खराब सॉफ्टवेयर इंजीनियरिंग अभ्यास है।

  2. ट्यूपल्स का उपयोग करके कई मूल्यों को वापस करना बहुत कम स्व-दस्तावेजीकरण है फिर विकल्प - नामित प्रकार लौटना या नामित संदर्भों का उपयोग करना। इस स्व-दस्तावेजीकरण के बिना, लौटाए गए मूल्यों के क्रम को भ्रमित करना आसान है, अगर वे पारस्परिक रूप से परिवर्तनीय हैं, और कोई समझदार नहीं हैं।


6

सभी लोग बूस्ट का उपयोग नहीं कर सकते, और TR1 अभी तक व्यापक रूप से उपलब्ध नहीं है।


3
बहुत सारे लोग बूस्ट का उपयोग करते हैं। वे लोग टुपल्स का भी उपयोग कर सकते हैं।
जिफ़्रे

3
आपने पूछा कि लोग उनका उपयोग क्यों नहीं करते हैं, और मैंने एक उत्तर दिया।
ब्रायन नील

2
नीचे के मतदाता के लिए: मैं एक ऐसी जगह पर काम करता हूं, जहां बूस्ट का उपयोग करना राजनीतिक रूप से असंभव है, और यहां तक ​​कि इस तिथि पर, कंपाइलर टूल चेन जो हम उपयोग करते हैं (एक एम्बेडेड सिस्टम के लिए) में TR1 / C ++ 11 समर्थन नहीं है।
ब्रायन नील

5

एम्बेडेड सिस्टम पर C ++ का उपयोग करते समय, बूस्ट पुस्तकालयों में खींचने से जटिल हो जाता है। वे एक-दूसरे को जोड़े, इसलिए लाइब्रेरी का आकार बढ़ता है। आप डेटा संरचनाएँ लौटाते हैं या ट्यूपल्स के बजाय पासिंग पैरामीटर का उपयोग करते हैं। जब पायथन में ट्यूपल्स लौटाते हैं तो डेटा संरचना क्रम में होती है और लौटे हुए मानों का प्रकार स्पष्ट नहीं होता है।


5

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

कहें कि हमारे पास एक फ़ंक्शन "एफ" है जहां एक टपल वापसी का मतलब हो सकता है। एक सामान्य नियम के रूप में, ऐसे कार्य आमतौर पर पर्याप्त रूप से जटिल होते हैं कि वे विफल हो सकते हैं।

यदि "f" विफल हो सकता है, तो आपको एक स्टेटस रिटर्न की आवश्यकता होती है- आखिरकार, आप नहीं चाहते कि कॉलर्स को विफलता का पता लगाने के लिए हर पैरामीटर का निरीक्षण करना पड़े। "f" शायद पैटर्न में फिट बैठता है:

struct ReturnInts ( int y,z; }
bool f(int x, ReturnInts& vals);

int x = 0;
ReturnInts vals;
if(!f(x, vals)) {
    ..report error..
    ..error handling/return...
}

यह सुंदर नहीं है, लेकिन विकल्प कितना बदसूरत है, इसे देखें। ध्यान दें कि मुझे अभी भी एक स्थिति मूल्य की आवश्यकता है, लेकिन कोड अधिक पठनीय नहीं है और कम नहीं है। यह शायद धीमी भी है, क्योंकि मैं 1 कॉपी की कीमत टुप से लगाता हूं।

std::tuple<int, int, bool> f(int x);
int x = 0;
std::tuple<int, int, bool> result = f(x); // or "auto result = f(x)"
if(!result.get<2>()) {
    ... report error, error handling ...
}

एक और महत्वपूर्ण नकारात्मक पहलू यहां छिपा है- "रिटर्नइन्ट्स" के साथ, मैं फेरबदल के बिना "रिटर्नइन" को संशोधित करके "एफ" रिटर्न को बदल सकता हूं। टपल समाधान उस महत्वपूर्ण विशेषता की पेशकश नहीं करता है, जो इसे किसी भी पुस्तकालय कोड के लिए अवर उत्तर बनाता है।


1
अपवाद उस इंटरफ़ेस को बहुत क्लीनर बनाते हैं।
डेविड स्टोन

निष्पक्ष होना (और पार्टी के लिए बहुत देर हो चुकी) आप सेटिंग में using std::tuple;और tupleकोड में उपयोग करके पठनीयता को कम कर सकते हैं ।
अलकेर

2
उपयोग tupleकोड को कम पठनीय बनाता है , अधिक नहीं। इन दिनों अधिकांश कोड में प्रतीकों की एक बड़ी संख्या होती है - देखने std::tupleसे यह आंख को स्पष्ट करता है कि यह क्या है।
टॉम स्विरली

3

निश्चित रूप से ट्यूपल्स उपयोगी हो सकते हैं, लेकिन जैसा कि उल्लेख किया गया है कि ओवरहेड का एक बिट और एक बाधा है या दो आपको पहले से ही कूदना पड़ता है इससे पहले कि आप वास्तव में उनका उपयोग कर सकें।

यदि आपका प्रोग्राम लगातार ऐसे स्थान पाता है, जहाँ आपको कई मानों को वापस करने या कई मानों की अदला-बदली करने की ज़रूरत है, तो टुपल मार्ग पर जाने के लिए इसके लायक हो सकता है, लेकिन अन्यथा कभी-कभी क्लासिक तरीके से काम करना आसान होता है।

आम तौर पर, हर किसी के पास पहले से ही बूस्ट स्थापित नहीं है, और मैं निश्चित रूप से इसे डाउनलोड करने की परेशानी से नहीं गुज़रूंगा और अपने शामिल निर्देशिकाओं को कॉन्फ़िगर करने के लिए इसके साथ काम करना होगा। मुझे लगता है कि आप पाएंगे कि पहले से ही बूस्ट का उपयोग करने वाले लोग गैर-बूस्ट उपयोगकर्ताओं की तुलना में अपने कार्यक्रमों में टपल का उपयोग करने की अधिक संभावना रखते हैं, और अन्य भाषाओं के प्रवासियों (पायथन को ध्यान में आता है) से केवल ट्यूल की कमी के बारे में परेशान होने की संभावना है सी ++ में टपल समर्थन जोड़ने के तरीकों का पता लगाने की तुलना में।


1

डेटा-स्टोर के रूप में एक सरणी और सरणी std::tupleदोनों की सबसे खराब विशेषताएं हैं struct; सभी पहुंच nth स्थिति पर आधारित है, लेकिन एक tupleका उपयोग करके कोई पुनरावृति नहीं कर सकता हैfor लूप ।

इसलिए यदि तत्व में tupleवैचारिक रूप से एक सरणी है, तो मैं एक सरणी का उपयोग करूंगा और यदि तत्व अवधारणात्मक रूप से एक सरणी नहीं हैं, तो एक संरचना (जिसका नाम तत्वों का है) अधिक बनाए रखने योग्य है। ( a.lastnameकी तुलना में अधिक व्याख्यात्मक है std::get<1>(a))।

यह ओपी द्वारा उल्लिखित परिवर्तन को टुपल्स के लिए एकमात्र व्यवहार्य usecase के रूप में छोड़ देता है।


0

मुझे लगता है कि कई Boost.Tuple के बजाय Boost.Any और Boost.Variant (कुछ इंजीनियरिंग के साथ) का उपयोग करते हैं।


आप उन जैसे कुछ के लिए कुशल स्थैतिक टाइपिंग क्यों करेंगे?
ज़ीफ्रे

Boost.Variant पूरी तरह से सुरक्षित है।
user21714

1
उफ़, हाँ यह टाइपसेफ़ है, लेकिन यह रनटाइम टाइपिंग करता है।
ज़िफ्रे

5
मैं यह नहीं देखता कि टपल को किसी भी / वेरिएंट में कैसे बदला जा सकता है। वे एक ही काम नहीं करते हैं।
मकरसे

1
@Zifre मैं लेखक के लिए नहीं बोल सकता, लेकिन मुझे लगता है कि यहाँ निहितार्थ अन्य कंटेनर प्रकारों के साथ उनका उपयोग कर रहा है।
टिम सेगुइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.