รับองค์ประกอบสุดท้ายของ std :: string


87

ฉันสงสัยว่ามีตัวย่อหรือวิธีที่หรูหรากว่าในการรับอักขระสุดท้ายของสตริงเช่นใน:

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

สิ่งที่myString.back()ดูเหมือนจะไม่มีอยู่จริง มีเทียบเท่าหรือไม่?


ฉันคิดว่ามันไม่จำเป็นเพราะคุณสามารถทำได้อย่างง่ายดายด้วยฟังก์ชั่นที่ให้มา
Hoàng Long

4
อาร์กิวเมนต์นั้นจะมีไว้สำหรับคลาสคอนเทนเนอร์เช่นกัน
Deve

คำตอบ:


130

ใน C ++ 11 ขึ้นไปคุณสามารถใช้backฟังก์ชันสมาชิก:

char ch = myStr.back();

ใน C ++ 03 std::string::backไม่สามารถใช้งานได้เนื่องจากการกำกับดูแล แต่คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการอ้างถึงreverse_iteratorสิ่งที่คุณได้รับกลับมาจากrbegin:

char ch = *myStr.rbegin();

ในทั้งสองกรณีโปรดใช้ความระมัดระวังเพื่อให้แน่ใจว่าสตริงมีอักขระอย่างน้อยหนึ่งตัวจริงๆ! มิฉะนั้นคุณจะได้รับพฤติกรรมที่ไม่ได้กำหนดซึ่งเป็นสิ่งที่ไม่ดี

หวังว่านี่จะช่วยได้!


13
มีการเพิ่มฟังก์ชัน back () ใน C ++ 11
eddi

1
@ eddi- ขอบคุณที่ชี้ให้เห็น! ฉันได้อัปเดตคำตอบตามนั้น
templatetypedef

หมายเหตุ: ฉันต้องบังคับให้ g ++ คอมไพล์ด้วย--std=c++11เพื่อback()ให้พร้อมใช้งาน
JulianHarty

@JulianHarty นั่นเป็นความจริงสำหรับคุณสมบัติ C ++ 11 ส่วนใหญ่ฉันเชื่อ :-)
templatetypedef

22

คุณอาจต้องการตรวจสอบความยาวของสตริงก่อนและทำสิ่งนี้:

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

2
คุณไม่ต้องตรวจสอบความยาว หากเป็นสตริงว่างคุณจะได้รับ '\ 0' เก็บไว้ใน lastChar
Mark Loeser

4
@MarkLoeser: นั่นไม่เป็นความจริง *myStr.end()ไม่เหมือนกับmyStr[myStr.size()]! และแม้ว่าจะมีmyStr.rbegin()ค่าเท่ากับmyStr.end()-1ซึ่งไม่ถูกต้องอย่างชัดเจนในสตริงว่าง
Lightness Races ใน Orbit

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)อาจจะ? นั่นก็ไม่สง่างามเช่นกัน

python-esque myString.at(-1)จะขอคลาสที่ป่องอยู่แล้วมากเกินไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.