2016-02-26 7 views
11

मैंने देखा है किstd :: string :: append() std :: string :: ऑपरेटर +() से कम शक्तिशाली क्यों है?

std::string str; 
str += 'b'; // works 
str.append('b'); // does not work 
str.append(1, 'b'); // works, but not as nice as the previous 

वहाँ किसी भी कारण है कि append विधि एकल वर्ण का समर्थन नहीं करता संलग्न किया जा करने के लिए है? मुझे लगता है कि operator+= वास्तव में append विधि के लिए एक आवरण है, लेकिन ऐसा लगता है कि यह मामला नहीं है।

+0

यह तकनीकी रूप से नहीं है कि यह कम शक्तिशाली है, लेकिन कोई भी नहीं सोचा था कि 'std :: string :: append (char)' लिखना आवश्यक था। यदि आप ऐसा करना चाहते हैं तो '+ =' का उपयोग करें ... –

+0

संबंधित: http://stackoverflow.com/questions/1472048/how-to-append-a-char-to-a-stdstring –

+0

आप 'std का उपयोग कर सकते हैं :: string :: संलग्न करें (गिनती, चार) '' count = 1'or 'std :: string :: push_back (char)' –

उत्तर

2

यह ध्यान रखना दिलचस्प है कि append का रूप यहां;

string& append(size_type count, CharT ch); 

निर्माता similar input लेने प्रतिबिंबित करता है।

basic_string(size_type count, 
       CharT ch, 
       const Allocator& alloc = Allocator()); 

और इस तरह के resize(size_type count, CharT ch); रूप में कुछ अन्य तरीकों कि एक चरित्र के साथ एक count लेते हैं,।

स्ट्रिंग क्लास बड़ा है और यह संभव है कि str.append('b'); के लिए विशेष उपयोग केस (और अधिभार) पर विचार नहीं किया गया था, या विकल्प पर्याप्त माना गया था।

बस सरल इस के लिए एक एकल अधिभार की शुरूआत अस्पष्टता को पेश कर सकता अभिन्न int और char अनुरूप (कुछ प्लेटफार्मों पर इस मामले में हो सकता है) है।

append के कई विकल्प हैं जो एक एकल वर्ण जोड़ रहे हैं।

  • एक वर्ण युक्त एक स्ट्रिंग जोड़ना str.append("b"); किया जा सकता है। यद्यपि यह बिल्कुल वही नहीं है, इसका एक ही प्रभाव है।
  • जैसा कि बताया जा रहा है operator+=
  • वहाँ भी, push_back() है, जो अन्य मानक कंटेनर

प्वाइंट, यह शायद एक उपयोग के मामले (या मजबूत पर्याप्त उपयोग के मामले) के रूप में माना नहीं किया गया है के साथ संगत है है इस प्रकार , इसके लिए पूरा करने के लिए append में एक उपयुक्त अधिभार/हस्ताक्षर जोड़ा नहीं गया था।


वैकल्पिक डिजाइन बहस किया जा सकता है, लेकिन मानक और इस वर्ग की परिपक्वता को देखते हुए यह संभावना नहीं है कि वह जल्द ही बदल जाएगा - यह बहुत अच्छी तरह से कोड का एक बहुत तोड़ सकते थे।

append के लिए वैकल्पिक हस्ताक्षर भी विचार किए जा सकते हैं; एक संभावित समाधान count और char (संभवतः एक डिफ़ॉल्ट जोड़ना) के क्रम को उलट करने के लिए किया जा सकता था;

string& append(CharT ch, size_type count = 1); 

एक और, critique of basic_string में से कुछ में वर्णित के रूप append दूर करने के लिए, वहाँ प्राप्त करने के लिए यह क्या करता है कई तरीके हैं।

5

मुझे लगता है कि operator+=() सभी साधारण मामलों (केवल एक पैरामीटर लेना) को संभालने का इरादा है, जबकि append() उन चीज़ों के लिए है जिन्हें एक से अधिक पैरामीटर की आवश्यकता होती है।

मैं वास्तव में अस्तित्व एकल पैरामीटर append(const basic_string& str) की और append(const CharT* s)अभाव append(CharT c) की के बारे में की तुलना में के बारे में अधिक हैरान हूं।

इसके अलावा मेरी टिप्पणी भी ध्यान दें: char केवल एक पूर्णांक प्रकार है। append() पर एकल-पैरामीटर, पूर्णांक-प्रकार अधिभार जोड़ना - या कन्स्ट्रक्टर (जो, डिज़ाइन द्वारा, कई पहले से ही पूर्णांक-प्रकार अधिभार) अस्पष्टता पेश कर सकता है।

जब तक किसी को कुछ लिखित तर्क मिलते हैं, या कुछ समिति के सदस्य यहां पोस्ट करते हैं, तो वे चर्चा के बारे में क्या याद करते हैं, शायद यह किसी भी तरह के स्पष्टीकरण के रूप में अच्छा है।

संबंधित मुद्दे