[英]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 函數在刪除句點后將迭代器返回到該點,然后擦除函數從該點開始擦除。 我糊塗了。 有任何想法嗎?
很容易混淆,但刪除功能並沒有刪除所有的句點。
假設在remove
您的字符串之前是"abc"
然后在remove
之后它將是"abc..."
。 擦除方法所做的是擦除現在位於字符串末尾的句點。
現在問為什么remove
會這樣是一個合理的問題,但是想想remove
有什么,它只有一對迭代器。 迭代器不能用於從容器中刪除項目,迭代器不能讓您訪問它所引用的容器。 所以remove
(和其他類似的函數)不能從容器中刪除任何東西。 他們所能做的就是重新排列順序,以便稍后的一些代碼可以輕松地進行實際刪除。
這個習語有一個名字,但它現在讓我無法理解。
std::remove
作用於一個范圍。 范圍是一對分別表示其begin
和end
的迭代器。
std::string::erase
或任何容器erase
,作用於string
(/container)。
從一個范圍中移除一個元素可以被認為是返回一個新的范圍。 例如,您通過將元素放在end
從范圍中刪除元素,新范圍是從begin
到end-1
。
從容器中擦除元素是不同的。 容器擁有該元素並負責實際“擦除”該元素。
總結:您開始將temp.begin()
直到temp.end()
組成的范圍內的所有元素傳遞給std::remove
,它返回新范圍的end
(在對元素進行混temp.end()
),最后是std::string::erase
縮小string
以僅包含新的字符范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.