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

C++ A C++;用一行代码替换字符串中所有句点的方法?,c++,string,replaceall,C++,String,Replaceall,需要修改给定的字符串,以便不存在句点。绳子的其余部分保持完整 我想到了使用迭代方法和string::erase。 在java中,我可以用replaceAll函数轻松地完成它。 按照这些思路,开发人员发布了一个解决方案: temp.erase(remove(temp.begin(),temp.end(),'.'),temp.end()); 这行代码工作得很好。然而,我无法理解它是如何工作的。据我所知,擦除功能删除范围内的所有字符。 remove函数将迭代器返回到删除句点后的点,然

需要修改给定的字符串,以便不存在句点。绳子的其余部分保持完整

我想到了使用迭代方法和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
作用于一个范围。范围是一对迭代器,分别表示其
开始
结束

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

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

从容器中删除元素是另一回事。容器拥有该元素,并负责实际“擦除”该元素


总而言之:您将启动由
temp.begin()
组成的范围内的所有元素,直到
temp.end()
传递给
std::remove
,它将返回新范围内的
end
(在无序移动元素之后)最后,
std::string::erase
收缩
字符串
以仅包含新的字符范围。

您的理解是正确的。相关/重复:“有什么想法”关于什么,确切地说?你的问题是什么?可能是重复的哦,所以删除是删除后的最后三点删除是改变字符串?伟大的这就解释了!在
remove
之后,字符串很可能是“abc.c.”,因为它将好的元素移到开头。这更像是一个左移,而不是一个分区操作。@blastfurny是的,很好。以前我认为容器的尾部是未指定的。@如果您得到它,这就是擦除/删除习惯用法也是非常有效的。这只是每场比赛的交换。一次擦除一个元素的速度很慢,因为每个元素之后的所有元素都必须向下移动才能擦除每个项目。因此,即使没有迭代器问题,这也是一种糟糕的方法。