एक std :: string का अंतिम तत्व प्राप्त करें


87

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

char lastChar = myString.at( myString.length() - 1 );

ऐसा कुछ myString.back()मौजूद नहीं है। क्या कोई समकक्ष है?


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

4
यह तर्क कंटेनर कक्षाओं के लिए भी रहेगा।
एच.डी.

जवाबों:


129

C ++ 11 और उसके बाद, आप backसदस्य फ़ंक्शन का उपयोग कर सकते हैं :

char ch = myStr.back();

C ++ 03 में, std::string::backएक ओवरसाइट के कारण उपलब्ध नहीं है, लेकिन आप इसके आसपास से प्राप्त कर सकते हैं जिसे reverse_iteratorआप वापस प्राप्त करते हैं rbegin:

char ch = *myStr.rbegin();

दोनों मामलों में, यह सुनिश्चित करने के लिए सावधान रहें कि स्ट्रिंग में वास्तव में कम से कम एक चरित्र है! अन्यथा, आपको अनिर्धारित व्यवहार मिलेगा , जो एक खराब बात है।

उम्मीद है की यह मदद करेगा!


13
एक बैक () फ़ंक्शन C ++ 11
eddi

1
@ eddi- यह इंगित करने के लिए धन्यवाद! मैंने उसी हिसाब से अपना जवाब अपडेट किया है।
templatetypedef

नोट: मुझे उपलब्ध होने के --std=c++11लिए संकलन करने के लिए g ++ को मजबूर करना पड़ा back()
जूलियनहार्टी

@ जूलियनहार्टी अधिकांश सी ++ 11 विशेषताओं के लिए सच है, मुझे विश्वास है। :-)
templatetypedef

22

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

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

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

4
@MarkLoeser: यह सच नहीं है। *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);
}

तब आप back(foo)बिना किसी चिंता के कह सकते हैं कि क्या fooयह एक स्ट्रिंग या एक वेक्टर है।


2

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

एक अजगर-एस्क myString.at(-1)बहुत पहले से ही फूला हुआ वर्ग पूछ रहा होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.