2011-02-03 8 views
67

वहाँ एक संक्षिप्त नाम या की तरह में एक स्ट्रिंग का अंतिम वर्ण होने का एक और अधिक सुरुचिपूर्ण तरीका है मैं सोच रहा था जाओ अस्तित्व होना। क्या समकक्ष है? मेंएक एसटीडी के अंतिम तत्व :: स्ट्रिंग

char ch = myStr.back(); 

सी ++ 03, std::string::back एक निरीक्षण के कारण उपलब्ध नहीं है, लेकिन आप इस के आसपास reverse_iterator अपसंदर्भन से प्राप्त कर सकते हैं:

+0

मुझे लगता है कि यह आवश्यक नहीं है, क्योंकि आप प्रदान किए गए कार्यों के साथ इसे आसानी से कर सकते हैं। –

+4

वह तर्क कंटेनर कक्षाओं के लिए भी होगा। – Deve

उत्तर

100

सी ++ 11 में, आप back सदस्य समारोह का उपयोग कर सकते आप rbegin से वापस पाने:

char ch = *myStr.rbegin(); 

आशा इस मदद करता है!

+10

सी ++ 11 – eddi

+1

@ eddi- में एक बैक() फ़ंक्शन जोड़ा गया है- इसे इंगित करने के लिए धन्यवाद! मैंने तदनुसार अपना जवाब अपडेट कर लिया है। – templatetypedef

+0

नोट: मुझे उपलब्ध होने के लिए '--std = C++ 11' के साथ संकलित करने के लिए g ++ को मजबूर करना पड़ा। – JulianHarty

2

*(myString.end() - 1) शायद? यह बिल्कुल सुरुचिपूर्ण नहीं है।

एक पायथन-एस्क्यू myString.at(-1) पहले से ही एक ब्लूटेड कक्षा से बहुत अधिक पूछेगा।

20

आपको शायद पहले स्ट्रिंग की लंबाई की जाँच करें और इस तरह से कुछ करना चाहता हूँ:

if (!myStr.empty()) 
{ 
    char lastChar = *myStr.rbegin(); 
} 
+2

आपको लंबाई की जांच करने की आवश्यकता नहीं है। यदि यह खाली स्ट्रिंग है, तो आपको बस '\ 0' को अंतिम बार में संग्रहीत किया जाता है। –

+2

@ मार्क लॉसर: यह सच नहीं है। '* myStr.end()' 'myStr [myStr.size()]' जैसा नहीं है! और, भले ही यह था, 'myStr.rbegin() '' myStr.end() - 1' के बराबर है, जो एक खाली स्ट्रिंग पर स्पष्ट रूप से अमान्य है। –

7

आप एक समारोह टेम्पलेट back लिख सकता है कि साधारण कंटेनरों के लिए सदस्य समारोह और एक सामान्य समारोह है कि लागू करने के लिए प्रतिनिधियों तार के लिए याद आ रही कार्यक्षमता:

template <typename C> 
typename C::reference back(C& container) 
{ 
    return container.back(); 
} 

template <typename C> 
typename C::const_reference back(const C& container) 
{ 
    return container.back(); 
} 

char& back(std::string& str) 
{ 
    return *(str.end() - 1); 
} 

char back(const std::string& str) 
{ 
    return *(str.end() - 1); 
} 

तो फिर तुम बस कि क्या foo में चिंता किए बिना back(foo) कह सकते हैं एक स्ट्रिंग या एक वेक्टर है।

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