2011-02-03 12 views
67

Me preguntaba si hay una abreviatura o una forma más elegante de conseguir el último carácter de una cadena como en: no pareceObtener el último elemento de un std :: string

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

Algo así como myString.back() existir. ¿Hay un equivalente?

+0

Creo que no es necesario, porque puede hacerlo fácilmente con las funciones proporcionadas. –

+4

Ese argumento también se aplicaría a las clases de contenedor. – Deve

Respuesta

100

En C++ 11, puede utilizar la función de miembro de back:

char ch = myStr.back(); 

En C++ 03, std::string::back no está disponible debido a un descuido, pero se puede evitar esto mediante la eliminación de referencias a la reverse_iterator regrese de rbegin:

char ch = *myStr.rbegin(); 

Espero que esto ayude!

+10

se ha agregado una función back() en C++ 11 – eddi

+1

@ eddi- ¡Gracias por señalar eso! He actualizado mi respuesta en consecuencia. – templatetypedef

+0

Nota: tuve que obligar a g ++ a compilar con '--std = C++ 11' para' back() 'para estar disponible. – JulianHarty

2

*(myString.end() - 1) ¿quizás? Eso tampoco es exactamente elegante.

Un python-esque myString.at(-1) sería pedir demasiado de una clase ya hinchada.

20

Es posible que desee comprobar la longitud de la cadena primero y hacer algo como esto:

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

No es necesario que verifique la longitud. Si se trata de la cadena vacía, solo tienes '\ 0' almacenado en lastChar. –

+2

@MarkLoeser: Eso no es verdad. '* myStr.end()' no es lo mismo que 'myStr [myStr.size()]'! Y, incluso si lo fuera, 'myStr.rbegin()' es equivalente a 'myStr.end() - 1', que es claramente inválido en una cadena vacía. –

7

Se puede escribir una plantilla de función back que los delegados a la función de miembro de contenedores ordinarios y una función normal que los implementos la funcionalidad que falta para las 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); 
} 

a continuación, puedes decir back(foo) sin tener que preocuparse de si foo es una cadena o un vector.

Cuestiones relacionadas