Dapatkan elemen terakhir dari std :: string

87

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?

Deve
sumber
Saya pikir itu tidak perlu, karena Anda dapat melakukannya dengan mudah dengan fungsi yang disediakan.
Hoàng Long
4
Argumen itu akan berlaku untuk kelas kontainer juga.
Deve

Jawaban:

130

Di C ++ 11 dan seterusnya, Anda dapat menggunakan backfungsi anggota:

char ch = myStr.back();

Di C ++ 03, std::string::backtidak tersedia karena pengawasan, tetapi Anda dapat menyiasatinya dengan dereferensi saat reverse_iteratorAnda mendapatkan kembali rbegin:

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!

templatetypedef
sumber
13
fungsi back () telah ditambahkan di C ++ 11
eddi
1
@ eddi- Terima kasih telah menunjukkannya! Saya telah memperbarui jawaban saya.
templatetypedef
Catatan: Saya harus memaksa g ++ untuk kompilasi dengan --std=c++11untuk back()menjadi tersedia.
JulianHarty
@JulianHarty Itu benar untuk sebagian besar fitur C ++ 11, saya yakin. :-)
templatetypedef
22

Anda mungkin ingin memeriksa panjang senar terlebih dahulu dan melakukan sesuatu seperti ini:

if (!myStr.empty())
{
    char lastChar = *myStr.rbegin();
}
Kerri Brown
sumber
2
Anda tidak perlu memeriksa panjangnya. Jika itu adalah string kosong, Anda hanya perlu menyimpan '\ 0' ke lastChar.
Mark Loeser
4
@ MarkLoeser: Itu tidak benar. *myStr.end()tidak sama dengan myStr[myStr.size()]! Dan, bahkan jika itu, myStr.rbegin()sama dengan myStr.end()-1, yang jelas tidak valid pada string kosong.
Balapan Ringan di Orbit
7

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 apakah fooitu string atau vektor.

fredoverflow
sumber
2

*(myString.end() - 1)mungkin? Itu juga tidak terlalu elegan.

Seekor python-esque myString.at(-1)akan meminta terlalu banyak dari kelas yang sudah membengkak.

tenpn
sumber