【问题标题】:Get the last element of a std::string获取 std::string 的最后一个元素
【发布时间】:2011-02-03 09:50:58
【问题描述】:

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

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

myString.back() 之类的东西似乎不存在。有没有等价物?

【问题讨论】:

  • 我认为没有必要,因为您可以使用提供的功能轻松做到这一点。
  • 该参数也适用于容器类。

标签: c++ string


【解决方案1】:

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

char ch = myStr.back();

在 C++03 中,由于疏忽,std::string::back 不可用,但您可以通过取消引用从 rbegin 返回的 reverse_iterator 来解决此问题:

char ch = *myStr.rbegin();

在这两种情况下,请注意确保字符串实际上至少包含一个字符!否则,你会得到未定义的行为,这是一件坏事。

希望这会有所帮助!

【讨论】:

  • C++11 中增加了一个 back() 函数
  • @eddi- 感谢您指出这一点!我已经相应地更新了我的答案。
  • 注意:我必须强制 g++ 使用 --std=c++11 进行编译才能使 back() 可用。
  • @JulianHarty 我相信大多数 C++11 功能都是如此。 :-)
【解决方案2】:

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

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

【讨论】:

  • 您不必检查长度。如果它是空字符串,您只需将 '\0' 存储到 lastChar 中。
  • @MarkLoeser:这不是真的。 *myStr.end()myStr[myStr.size()] 不一样!而且,即使是这样,myStr.rbegin() 也等同于 myStr.end()-1,这在空字符串上显然是无效的。
【解决方案3】:

您可以编写一个函数模板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是字符串还是向量。

【讨论】:

    【解决方案4】:

    *(myString.end() - 1) 可能吗?这也不是很优雅。

    python 风格的 myString.at(-1) 对已经臃肿的类提出了太多要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      相关资源
      最近更新 更多