Saya bertanya-tanya apakah ada singkatan atau cara yang lebih elegan untuk mendapatkan karakter terakhir dari sebuah string seperti di:
char lastChar = myString.at( myString.length() - 1 );
Sesuatu myString.back()
sepertinya tidak ada. Apakah ada yang setara?
Jawaban:
Di C ++ 11 dan seterusnya, Anda dapat menggunakan
back
fungsi anggota:char ch = myStr.back();
Di C ++ 03,
std::string::back
tidak tersedia karena pengawasan, tetapi Anda dapat menyiasatinya dengan dereferensi saatreverse_iterator
Anda mendapatkan kembalirbegin
:char ch = *myStr.rbegin();
Dalam kedua kasus tersebut, berhati-hatilah untuk memastikan string benar-benar memiliki setidaknya satu karakter di dalamnya! Jika tidak, Anda akan mendapatkan perilaku tidak terdefinisi , yang merupakan Hal Buruk.
Semoga ini membantu!
sumber
--std=c++11
untukback()
menjadi tersedia.Anda mungkin ingin memeriksa panjang senar terlebih dahulu dan melakukan sesuatu seperti ini:
if (!myStr.empty()) { char lastChar = *myStr.rbegin(); }
sumber
*myStr.end()
tidak sama denganmyStr[myStr.size()]
! Dan, bahkan jika itu,myStr.rbegin()
sama denganmyStr.end()-1
, yang jelas tidak valid pada string kosong.Anda bisa menulis template fungsi
back
yang mendelegasikan fungsi anggota untuk wadah biasa dan fungsi normal yang mengimplementasikan fungsionalitas yang hilang untuk string: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); }
Kemudian Anda bisa mengatakan
back(foo)
tanpa khawatir apakahfoo
itu string atau vektor.sumber
*(myString.end() - 1)
mungkin? Itu juga tidak terlalu elegan.Seekor python-esque
myString.at(-1)
akan meminta terlalu banyak dari kelas yang sudah membengkak.sumber