ฉันสงสัยว่ามีตัวย่อหรือวิธีที่หรูหรากว่าในการรับอักขระสุดท้ายของสตริงเช่นใน:
char lastChar = myString.at( myString.length() - 1 );
สิ่งที่myString.back()
ดูเหมือนจะไม่มีอยู่จริง มีเทียบเท่าหรือไม่?
ฉันสงสัยว่ามีตัวย่อหรือวิธีที่หรูหรากว่าในการรับอักขระสุดท้ายของสตริงเช่นใน:
char lastChar = myString.at( myString.length() - 1 );
สิ่งที่myString.back()
ดูเหมือนจะไม่มีอยู่จริง มีเทียบเท่าหรือไม่?
คำตอบ:
ใน C ++ 11 ขึ้นไปคุณสามารถใช้back
ฟังก์ชันสมาชิก:
char ch = myStr.back();
ใน C ++ 03 std::string::back
ไม่สามารถใช้งานได้เนื่องจากการกำกับดูแล แต่คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการอ้างถึงreverse_iterator
สิ่งที่คุณได้รับกลับมาจากrbegin
:
char ch = *myStr.rbegin();
ในทั้งสองกรณีโปรดใช้ความระมัดระวังเพื่อให้แน่ใจว่าสตริงมีอักขระอย่างน้อยหนึ่งตัวจริงๆ! มิฉะนั้นคุณจะได้รับพฤติกรรมที่ไม่ได้กำหนดซึ่งเป็นสิ่งที่ไม่ดี
หวังว่านี่จะช่วยได้!
--std=c++11
เพื่อback()
ให้พร้อมใช้งาน
คุณอาจต้องการตรวจสอบความยาวของสตริงก่อนและทำสิ่งนี้:
if (!myStr.empty())
{
char lastChar = *myStr.rbegin();
}
*myStr.end()
ไม่เหมือนกับmyStr[myStr.size()]
! และแม้ว่าจะมีmyStr.rbegin()
ค่าเท่ากับmyStr.end()-1
ซึ่งไม่ถูกต้องอย่างชัดเจนในสตริงว่าง
คุณสามารถเขียนเทมเพลตฟังก์ชัน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
จะเป็นสตริงหรือเวกเตอร์
*(myString.end() - 1)
อาจจะ? นั่นก็ไม่สง่างามเช่นกัน
python-esque myString.at(-1)
จะขอคลาสที่ป่องอยู่แล้วมากเกินไป