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
我做错了什么?我在方法上犯了两个错误:
仅使用1个迭代器调用,将删除迭代器指向的元素,而不是从迭代器一直到末尾(我错误地假设)erase
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());