Eu queria saber se existe uma abreviatura ou uma maneira mais elegante de obter o último caractere de uma string como em:
char lastChar = myString.at( myString.length() - 1 );
Algo parecido com myString.back()
não parece existir. Existe um equivalente?
Respostas:
No C ++ 11 e posterior, você pode usar a
back
função de membro:char ch = myStr.back();
Em C ++ 03,
std::string::back
não está disponível devido a um descuido, mas você pode contornar isso desreferenciando o quereverse_iterator
você obteve de voltarbegin
:char ch = *myStr.rbegin();
Em ambos os casos, tenha o cuidado de se certificar de que a string tem pelo menos um caráter! Caso contrário, você obterá um comportamento indefinido , o que é uma coisa ruim.
Espero que isto ajude!
fonte
--std=c++11
paraback()
estar disponível.Você provavelmente deseja verificar o comprimento da string primeiro e fazer algo assim:
if (!myStr.empty()) { char lastChar = *myStr.rbegin(); }
fonte
*myStr.end()
não é o mesmo quemyStr[myStr.size()]
! E, mesmo se fosse,myStr.rbegin()
é equivalente amyStr.end()-1
, que é claramente inválido em uma string vazia.Você pode escrever um modelo de função
back
que delega a função de membro para contêineres comuns e uma função normal que implementa a funcionalidade ausente para strings: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); }
Então você pode simplesmente dizer
back(foo)
sem se preocupar sefoo
é uma string ou um vetor.fonte
*(myString.end() - 1)
talvez? Isso também não é exatamente elegante.Um python-esque
myString.at(-1)
seria pedir muito de uma classe já inchada.fonte