string erase使用向后迭代器追加元素

时间:2016-05-12 17:17:25

标签: c++ string c++11 iterator

我正在尝试从后面开始删除'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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我在方法中犯了2个错误:

    仅使用1个迭代器调用的
  • erase删除了迭代器指向的元素,而不是从迭代器到结尾(假设我假设)

所以str.erase(std::next(it).base(), str.end()); - 这仍然是错误的,继续阅读;)

  • 正如@KerrekSB指出的那样,我没有仔细阅读the docs:因为我使用std::reverse_iterator,元素会被推回到前面!因此,当it指向新的结束迭代器(在未删除的元素之前是BTW )时,我必须从开头(str.begin())删除范围it.base()

<小时/> TL; DR

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