ฉันสงสัยว่ามีตัวย่อหรือวิธีที่หรูหรากว่าในการรับอักขระสุดท้ายของสตริงเช่นใน:
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)จะขอคลาสที่ป่องอยู่แล้วมากเกินไป