获取std :: string的最后一个元素


87

我想知道是否有缩写或更优雅的方式来获取字符串的最后一个字符,例如:

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

喜欢的东西myString.back()似乎并不存在。有等同的吗?


我认为这是没有必要的,因为您可以使用提供的功能轻松完成此操作。
晃龙

4
该参数也适用于容器类。
Deve

Answers:


129

在C ++ 11及更高版本中,可以使用back成员函数:

char ch = myStr.back();

在C ++ 03中,std::string::back由于疏忽而无法使用,但是您可以通过取消引用reverse_iteratorrbegin以下位置获得的返回值来解决此问题:

char ch = *myStr.rbegin();

在这两种情况下,请务必确保该字符串实际上至少包含一个字符!否则,您将获得不确定的行为,这是一件坏事。

希望这可以帮助!


13
在C ++ 11中添加了back()函数
eddi 2013年

1
@ eddi-感谢您指出!我已经相应更新了我的答案。
templatetypedef

注:我不得不强迫G ++编译与--std=c++11back()可用。
朱利安·哈蒂(JulianHarty)'17

@JulianHarty我相信大多数C ++ 11功能都是如此。:-)
templatetypedef

22

您可能想先检查字符串的长度,然后执行以下操作:

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

2
您不必检查长度。如果它是空字符串,则只需将'\ 0'存储到lastChar中。
Mark Loeser

4
@MarkLoeser:那是不对的。*myStr.end()不一样myStr[myStr.size()]!并且,即使是,myStr.rbegin()也等同于myStr.end()-1,这对于空字符串显然是无效的。
Lightness Races in Orbit

7

您可以编写一个函数模板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

*(myString.end() - 1)也许?那也不是很优雅。

像pythonmyString.at(-1)这样的东西会问太多已经already肿的类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.