C++ A C++;用一行代码替换字符串中所有句点的方法?
需要修改给定的字符串,以便不存在句点。绳子的其余部分保持完整 我想到了使用迭代方法和string::erase。 在java中,我可以用replaceAll函数轻松地完成它。 按照这些思路,开发人员发布了一个解决方案:C++ A C++;用一行代码替换字符串中所有句点的方法?,c++,string,replaceall,C++,String,Replaceall,需要修改给定的字符串,以便不存在句点。绳子的其余部分保持完整 我想到了使用迭代方法和string::erase。 在java中,我可以用replaceAll函数轻松地完成它。 按照这些思路,开发人员发布了一个解决方案: temp.erase(remove(temp.begin(),temp.end(),'.'),temp.end()); 这行代码工作得很好。然而,我无法理解它是如何工作的。据我所知,擦除功能删除范围内的所有字符。 remove函数将迭代器返回到删除句点后的点,然
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是的,很好。以前我认为容器的尾部是未指定的。@如果您得到它,这就是擦除/删除习惯用法也是非常有效的。这只是每场比赛的交换。一次擦除一个元素的速度很慢,因为每个元素之后的所有元素都必须向下移动才能擦除每个项目。因此,即使没有迭代器问题,这也是一种糟糕的方法。