用一行代码替换字符串中所有句点的 C++ 方法?

A C++ way to replace all periods in a string with a single line of code?

需要修改给定的字符串,以便没有句点。字符串的其余部分保持不变。

我想到了使用迭代方法并使用 string::erase。 在 java 中,我可以使用 replaceAll 函数轻松完成它。 沿着这些思路思考,开发人员发布了一个解决方案:

        temp.erase(remove(temp.begin(),temp.end(),'.'),temp.end());

这行代码完美运行。但是我不明白它是如何工作的。据我了解,擦除功能会删除范围内的所有字符。 remove 函数将迭代器返回到删除句点后的点,然后 erase 函数从该点开始擦除。我很困惑。有什么想法吗?

很容易混淆,但是删除功能不是删除所有句点。

假设在 remove 之前你的字符串是 "a.b.c." 然后在 remove 之后它会是 "abc..."。擦除方法所做的是擦除现在位于字符串末尾的句点。

现在问为什么 remove 会这样是一个合理的问题,但是想想 remove 有什么,它只有一对迭代器。迭代器不能用于从容器中删除项目,迭代器不会让您访问它所引用的容器。所以 remove (和其他类似的函数)不能从容器中删除任何东西。他们所能做的就是重新排列顺序,以便后面的代码可以轻松地进行实际删除。

这个成语有一个名字,但我一时想不起来。

std::remove 作用于一个范围。范围是一对迭代器,分别表示其 beginend

std::string::erase 或任何容器 erase,作用于 string (/container)。

从一个范围中删除一个元素可以被认为是返回一个新的范围。例如,您通过将元素放置在 end 处从范围中删除一个元素,新范围是从 beginend-1

从容器中删除一个元素是不同的。容器拥有元素并实际负责 "erasing" 元素。

总结:你开始将 temp.begin()temp.end() 组成的范围内的所有元素传递给 std::remove,returns 你 end新范围的(在洗牌元素之后)最后 std::string::erase 缩小 string 只包含新的字符范围。