web-dev-qa-db-fra.com

Récupère le dernier élément d'un std :: string

Je me demandais s'il y avait une abréviation ou un moyen plus élégant d'obtenir le dernier caractère d'une chaîne comme dans:

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

Quelque chose comme myString.back() ne semble pas exister. Y a-t-il un équivalent?

81
Deve

En C++ 11 et au-delà, vous pouvez utiliser la fonction membre back:

char ch = myStr.back();

En C++ 03, std::string::back n'est pas disponible à cause d'un oubli, mais vous pouvez contourner ce problème en déréférencant le reverse_iterator vous revenez de rbegin:

char ch = *myStr.rbegin();

Dans les deux cas, veillez à ce que la chaîne contienne au moins un caractère! Sinon, vous aurez comportement non défini, ce qui est une mauvaise chose.

J'espère que cela t'aides!

120
templatetypedef

Vous voudrez probablement vérifier la longueur de la chaîne en premier et faire quelque chose comme ceci:

if (!myStr.empty())
{
    char lastChar = *myStr.rbegin();
}
22
Kerri Brown

Vous pouvez écrire un modèle de fonction back qui délègue à la fonction membre les conteneurs ordinaires et une fonction normale qui implémente la fonctionnalité manquante pour les chaînes:

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);
}

Ensuite, vous pouvez simplement dire back(foo) sans vous soucier de savoir si foo est une chaîne ou un vecteur.

7
fredoverflow

*(myString.end() - 1) peut-être? Ce n'est pas vraiment élégant non plus.

Une fonction python-esque myString.at(-1) demanderait trop d'une classe déjà saturée.

2
tenpn