Bir std :: string'in son elemanını al


87

Bir dizenin son karakterini elde etmenin bir kısaltma mı yoksa daha zarif bir yolu olup olmadığını merak ediyordum:

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

Görünüşe göre myString.back()yokmuş gibi bir şey . Eşdeğeri var mı?


Bunun gerekli olmadığını düşünüyorum, çünkü bunu sağlanan işlevlerle oldukça kolay bir şekilde yapabilirsiniz.
Hoàng Long

4
Bu argüman konteyner sınıfları için de geçerli olacaktır.
Deve

Yanıtlar:


130

C ++ 11 ve ötesinde backüye işlevini kullanabilirsiniz :

char ch = myStr.back();

C ++ 03'te, std::string::backbir gözetim nedeniyle kullanılamaz, ancak aşağıdakilerden reverse_iteratorgeri aldığınızdan vazgeçerek bunu aşabilirsiniz rbegin:

char ch = *myStr.rbegin();

Her iki durumda da, dizenin içinde gerçekten en az bir karakter bulunduğundan emin olun! Aksi takdirde, Kötü Şey olan tanımlanmamış davranışla karşılaşırsınız .

Bu yardımcı olur umarım!


13
C ++ 11'e bir back () işlevi eklendi
eddi

1
@ eddi- Bunu işaret ettiğiniz için teşekkürler! Cevabımı buna göre güncelledim.
templatetypedef

Not: Birlikte gr ++ için derleme zorlamak zorunda --std=c++11için back()kullanılabilir olması için.
JulianHarty

@JulianHarty Bunun çoğu C ++ 11 özelliği için doğru olduğuna inanıyorum. :-)
templatetypedef

22

Muhtemelen önce dizenin uzunluğunu kontrol etmek ve şöyle bir şey yapmak istersiniz:

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

2
Uzunluğunu kontrol etmenize gerek yok. Boş dizge ise, lastChar'da depolanan '\ 0' olur.
Mark Loeser

4
@MarkLoeser: Bu doğru değil. *myStr.end()ile aynı şey değil myStr[myStr.size()]! Ve olsa bile myStr.rbegin(), eşdeğerdir myStr.end()-1, boş bir dizede açıkça geçersizdir.
Yörüngede Hafiflik Yarışları

7

backSıradan kapsayıcılar için üye işlevini temsil eden bir işlev şablonu ve dizeler için eksik işlevselliği uygulayan normal bir işlev yazabilirsiniz :

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);
}

O zaman dize mi yoksa vektör back(foo)fooolduğunu merak etmeden söyleyebilirsin .


2

*(myString.end() - 1)olabilir? Bu da tam olarak zarif değil.

Bir python-esque myString.at(-1), zaten şişirilmiş bir sınıftan çok fazla şey istiyor olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.