Je me demandais s'il y avait une abréviation ou une manière plus élégante d'obtenir le dernier caractère d'une chaîne comme dans:
char lastChar = myString.at( myString.length() - 1 );
Quelque chose comme myString.back()
ça ne semble pas exister. Y a-t-il un équivalent?
Réponses:
Dans C ++ 11 et au-delà, vous pouvez utiliser la
back
fonction membre:char ch = myStr.back();
En C ++ 03,
std::string::back
n'est pas disponible en raison d'un oubli, mais vous pouvez contourner ce problème en déréférençant le point dereverse_iterator
retour derbegin
:char ch = *myStr.rbegin();
Dans les deux cas, veillez à vous assurer que la chaîne contient au moins un caractère! Sinon, vous obtiendrez un comportement non défini , ce qui est une mauvaise chose.
J'espère que cela t'aides!
la source
--std=c++11
pourback()
être disponible.Vous voudrez probablement vérifier d'abord la longueur de la chaîne et faire quelque chose comme ceci:
if (!myStr.empty()) { char lastChar = *myStr.rbegin(); }
la source
*myStr.end()
n'est pas la même chose quemyStr[myStr.size()]
! Et, même si c'était le cas,myStr.rbegin()
équivaut àmyStr.end()-1
, ce qui est clairement invalide sur une chaîne vide.Vous pouvez écrire un modèle de fonction
back
qui délègue à la fonction membre pour 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 s'ilfoo
s'agit d'une chaîne ou d'un vecteur.la source
*(myString.end() - 1)
peut être? Ce n'est pas vraiment élégant non plus.Un python-esque
myString.at(-1)
demanderait trop à une classe déjà gonflée.la source