C++ 字符串擦除使用向后迭代器附加元素

C++ 字符串擦除使用向后迭代器附加元素,c++,string,c++11,iterator,C++,String,C++11,Iterator,我试图从后面删除std::string中的每个'0'。根据,有多种方法可以。擦除反向迭代器 奇怪的是,它们都将数字附加到std::string,而不是删除它们 这是一个小样本 //'str' will be "5.090000" std::string str = std::to_string(5.09); auto it = std::remove_if(str.rbegin(), str.rend(), [](char value) { return value == '0'; }

我试图从后面删除
std::string
中的每个
'0'
。根据,有多种方法可以
。擦除
反向迭代器

奇怪的是,它们都将数字附加到
std::string
,而不是删除它们

这是一个小样本

//'str' will be "5.090000"
std::string str = std::to_string(5.09);

auto it = std::remove_if(str.rbegin(), str.rend(), [](char value) {
    return value == '0';
});
1) C++11之前的方式:

str.erase(--(it.base()));
2)
C++11
way(1)

3)
C++11
way(2)

在所有情况下,
str==“5.095.9”
。为什么?因为在我看来,
str
应该是
5.9
,但它不是

我最好的猜测是,我在使用向后迭代器时出错了,因为如果拆分字符串:
5.09 | 5.9
,第一个值仍然在
'0'
之间,但不是最后一个值。第二个值实际上是我期望的
std::string


我做错了什么?

我在方法上犯了两个错误:

  • erase
    仅使用1个迭代器调用,将删除迭代器指向的元素,而不是从迭代器一直到末尾(我错误地假设)
所以
str.erase(std::next(it.base(),str.end())-这仍然是错误的,请继续阅读;)

  • 正如@KerrekSB所指出的,我读得不够仔细:因为我使用的是
    std::reverse_迭代器
    ,元素被推回前面!因此,由于
    it
    指向新的结束迭代器(在未删除的元素之前是BTW),我必须删除从开始(
    str.begin()
    )到
    it.base()
    )的范围

TL;博士


新的工作版本是:
str.erase(str.begin(),it.base())

请仔细阅读
std::remove_if
的文档,并考虑您正在操作的范围。@tobi303-这是RTFM给您的:如何使用
str.find_last_not_of('0')
来查找最后一个非零位。如果要删除所有
0
的数字,为什么要从后面开始,无论如何?@Rakete1111但你的问题是“…尝试删除每个“0”…”
str.erase(std::next(it).base());
std::advance(it, 1);
str.erase(it.base());