优雅地删除字符串中最后一个字符及其后面的内容。

10
假设我想从字符串中删除最后一个 '*'(例如),并保留此字符串的以下特点:
  1. 它将始终包含一个 '*'
  2. 它可能包含多个 '*'
  3. 它永远不会以 '*' 开头或结尾
使用基本库,最干净和/或最短的方法是什么?
2个回答

24

鉴于你的假设:

s.erase(s.rfind('*'));

没有假设它包含至少一个*

auto pos = s.rfind('*');
if (pos != std::string::npos) {
    s.erase(pos);
}

说,.rfind()和.find_last_of()有什么区别? - leinaD_natipaC
虽然我已经接近于垃圾邮件了,但我找到了上一个问题的答案:s.rfind("abc")将查找字符串"abc"的最后一次出现,而s.find_last_of("abc")将查找'a'、'b'或'c'的最后一次出现。 - leinaD_natipaC
@leinaD_natipaC:是的,没错。但是在这里,你只是寻找单个字符,因此两者是等价的。 - Mike Seymour

2

由于 rfind返回目标字符或字符串的索引,我们还可以使用 resize来截取输入字符串中不需要的部分。

s.resize(s.rfind('*'));

改变尺寸比擦除好吗? - leinaD_natipaC
1
根据这个页面resize进行了更多边界检查并具有更强的异常安全性,这也意味着它可能比erase稍微慢一些。我不确定如何在这里定义"better",但我觉得在C++中,erase更常与remove一起使用以适应删除-移除惯用法。 - wu1meng2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接