Мне было интересно, есть ли сокращение или более элегантный способ получить последний символ строки, например:
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строка это или вектор.