我正在尝试从后面开始删除'0'
中的每个std::string
。根据{{3}},.erase
后向迭代器有多种方法。
奇怪的是,他们都将数字附加到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
方式(1)
str.erase(std::next(it).base());
3)C++11
way(2)
std::advance(it, 1);
str.erase(it.base());
在所有情况下,str == "5.095.9"
。为什么?因为我认为str
应该是5.9
,但它不是......
我最好的猜测是我在向后迭代器上做错了,因为如果你拆分字符串:5.09 | 5.9
,第一个值仍然是中间'0'
,但不是最后一个那些。第二个值实际上是我预期的std::string
。
我做错了什么?
答案 0 :(得分:1)
我在方法中犯了2个错误:
erase
删除了迭代器指向的元素,而不是从迭代器到结尾(假设我假设)所以str.erase(std::next(it).base(), str.end());
- 这仍然是错误的,继续阅读;)
std::reverse_iterator
,元素会被推回到前面!因此,当it
指向新的结束迭代器(在未删除的元素之前是BTW )时,我必须从开头(str.begin()
)删除范围it.base()
。<小时/> TL; DR
新的工作版本为:str.erase(str.begin(), it.base());