Мені було цікаво, чи існує скорочення або більш елегантний спосіб отримати останній символ рядка, як у:
char lastChar = myString.at( myString.length() - 1 );
Щось начебто myString.back()не існує. Чи існує еквівалент?
Мені було цікаво, чи існує скорочення або більш елегантний спосіб отримати останній символ рядка, як у:
char lastChar = myString.at( myString.length() - 1 );
Щось начебто myString.back()не існує. Чи існує еквівалент?
Відповіді:
У C ++ 11 і пізніших версіях ви можете використовувати функцію- backчлен:
char ch = myStr.back();
У C ++ 03 std::string::backнедоступний через недогляд, але ви можете обійти це шляхом розмежування посилань, з яких reverse_iteratorви повертаєтесь rbegin:
char ch = *myStr.rbegin();
В обох випадках будьте обережні, щоб переконатися, що в рядку насправді є хоча б один символ! В іншому випадку ви отримаєте невизначену поведінку , а це погана річ.
Сподіваюся, це допомагає!
--std=c++11для back()бути доступні.
Можливо, вам спочатку потрібно перевірити довжину рядка і зробити щось подібне:
if (!myStr.empty())
{
char lastChar = *myStr.rbegin();
}
*myStr.end()це не те саме, що myStr[myStr.size()]! І навіть якщо б це було, myStr.rbegin()це еквівалентно myStr.end()-1, що явно недійсне для порожнього рядка.
Ви можете написати шаблон функції, backякий делегує функцію-член для звичайних контейнерів і звичайну функцію, яка реалізує відсутні функції для рядків:
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);
}
Тоді ви можете просто сказати, back(foo)не турбуючись foo, це рядок чи вектор.