Me preguntaba si hay una abreviatura o una forma más elegante de obtener el último carácter de una cadena como en:
char lastChar = myString.at( myString.length() - 1 );
Algo como myString.back()no parece existir. ¿Existe un equivalente?
Me preguntaba si hay una abreviatura o una forma más elegante de obtener el último carácter de una cadena como en:
char lastChar = myString.at( myString.length() - 1 );
Algo como myString.back()no parece existir. ¿Existe un equivalente?
Respuestas:
En C ++ 11 y posteriores, puede usar la backfunción miembro:
char ch = myStr.back();
En C ++ 03, std::string::backno está disponible debido a un descuido, pero puede evitar esto eliminando la referencia de lo reverse_iteratorque obtiene rbegin:
char ch = *myStr.rbegin();
En ambos casos, asegúrese de que la cadena tenga al menos un carácter. De lo contrario, obtendrá un comportamiento indefinido , lo cual es algo malo.
¡Espero que esto ayude!
--std=c++11para back()que estuviera disponible.
Probablemente desee verificar primero la longitud de la cadena y hacer algo como esto:
if (!myStr.empty())
{
char lastChar = *myStr.rbegin();
}
*myStr.end()no es lo mismo que myStr[myStr.size()]! E, incluso si lo fuera, myStr.rbegin()es equivalente a myStr.end()-1, que es claramente inválido en una cadena vacía.
Podría escribir una plantilla de función backque delegue a la función miembro para contenedores ordinarios y una función normal que implemente la funcionalidad faltante para cadenas:
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);
}
Entonces puede decir back(foo)sin preocuparse si fooes una cadena o un vector.