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?
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ć backfunkcji składowej:
char ch = myStr.back();
W C ++ 03 std::string::backnie jest dostępny z powodu przeoczenia, ale możesz obejść ten problem, wyłuskując dane reverse_iteratorotrzymane z rbegin:
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!
--std=c++11do back()być dostępne.
Prawdopodobnie chcesz najpierw sprawdzić długość ciągu i zrobić coś takiego:
if (!myStr.empty())
{
char lastChar = *myStr.rbegin();
}
*myStr.end()to nie to samo co myStr[myStr.size()]! A nawet gdyby tak było, myStr.rbegin()jest równoważne z myStr.end()-1, co jest po prostu niepoprawne w pustym łańcuchu.
Możesz napisać szablon funkcji, backktó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ę, czy foojest to ciąg, czy wektor.