Zastanawiałem się, czy istnieje skrót lub bardziej elegancki sposób uzyskania ostatniego znaku ciągu, jak w:
char lastChar = myString.at( myString.length() - 1 );
myString.back()
Wydaje się, że coś takiego nie istnieje. Czy istnieje odpowiednik?
Odpowiedzi:
W C ++ 11 i nowszych możesz użyć
back
funkcji składowej:char ch = myStr.back();
W C ++ 03
std::string::back
nie jest dostępny z powodu przeoczenia, ale możesz obejść ten problem, wyłuskując danereverse_iterator
otrzymane zrbegin
:char ch = *myStr.rbegin();
W obu przypadkach upewnij się, że ciąg zawiera co najmniej jeden znak! W przeciwnym razie uzyskasz niezdefiniowane zachowanie , co jest złą rzeczą.
Mam nadzieję że to pomoże!
źródło
--std=c++11
doback()
być dostępne.Prawdopodobnie chcesz najpierw sprawdzić długość ciągu i zrobić coś takiego:
if (!myStr.empty()) { char lastChar = *myStr.rbegin(); }
źródło
*myStr.end()
to nie to samo comyStr[myStr.size()]
! A nawet gdyby tak było,myStr.rbegin()
jest równoważne zmyStr.end()-1
, co jest po prostu niepoprawne w pustym łańcuchu.Możesz napisać szablon funkcji,
back
który deleguje do funkcji składowej dla zwykłych kontenerów i normalną funkcję, która implementuje brakującą funkcję dla ciągów: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); }
Wtedy możesz po prostu powiedzieć,
back(foo)
nie martwiąc się, czyfoo
jest to ciąg, czy wektor.źródło
*(myString.end() - 1)
może? To też nie jest zbyt eleganckie.Python-esque
myString.at(-1)
wymagałby zbyt wiele od i tak już rozdętej klasy.źródło