用一行代码替换字符串中所有句点的 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
作用于一个范围。范围是一对迭代器,分别表示其 begin
和 end
。
std::string::erase
或任何容器 erase
,作用于 string
(/container)。
从一个范围中删除一个元素可以被认为是返回一个新的范围。例如,您通过将元素放置在 end
处从范围中删除一个元素,新范围是从 begin
到 end-1
。
从容器中删除一个元素是不同的。容器拥有元素并实际负责 "erasing" 元素。
总结:你开始将 temp.begin()
到 temp.end()
组成的范围内的所有元素传递给 std::remove
,returns 你 end
新范围的(在洗牌元素之后)最后 std::string::erase
缩小 string
只包含新的字符范围。
需要修改给定的字符串,以便没有句点。字符串的其余部分保持不变。
我想到了使用迭代方法并使用 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
作用于一个范围。范围是一对迭代器,分别表示其 begin
和 end
。
std::string::erase
或任何容器 erase
,作用于 string
(/container)。
从一个范围中删除一个元素可以被认为是返回一个新的范围。例如,您通过将元素放置在 end
处从范围中删除一个元素,新范围是从 begin
到 end-1
。
从容器中删除一个元素是不同的。容器拥有元素并实际负责 "erasing" 元素。
总结:你开始将 temp.begin()
到 temp.end()
组成的范围内的所有元素传递给 std::remove
,returns 你 end
新范围的(在洗牌元素之后)最后 std::string::erase
缩小 string
只包含新的字符范围。