Получить последний элемент std:: string


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

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

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

4 75

4 ответа:

в C++11 и выше, вы можете использовать back функции:

char ch = myStr.back();

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

char ch = *myStr.rbegin();

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

надеюсь, что это помогает!

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

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

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

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

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