Получить последний элемент std :: string - PullRequest
80 голосов
/ 03 февраля 2011

Мне было интересно, есть ли аббревиатура или более элегантный способ получения последнего символа строки, например:

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

Что-то вроде myString.back() не существует.Есть ли эквивалент?

Ответы [ 4 ]

118 голосов
/ 03 февраля 2011

В C ++ 11 и более поздних версиях вы можете использовать функцию-член back:

char ch = myStr.back();

В C ++ 03 std::string::back недоступна из-за недосмотра, но вы можетеобойти это, разыменовав reverse_iterator, который вы получите от rbegin:

char ch = *myStr.rbegin();

В обоих случаях будьте осторожны, чтобы убедиться, что в строке есть хотя бы один символ!В противном случае вы получите неопределенное поведение , что является плохой вещью.

Надеюсь, это поможет!

22 голосов
/ 03 февраля 2011

Вы, вероятно, хотите сначала проверить длину строки и сделать что-то вроде этого:

if (!myStr.empty())
{
    char lastChar = *myStr.rbegin();
}
7 голосов
/ 03 февраля 2011

Вы можете написать шаблон функции 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 строкой или вектором.

2 голосов
/ 03 февраля 2011

*(myString.end() - 1) возможно?Это тоже не совсем элегантно.

Python-esque myString.at(-1) потребовал бы слишком много от уже раздутого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...