簡體   English   中英

用一行代碼替換字符串中所有句點的 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 函數在刪除句點后將迭代器返回到該點,然后擦除函數從該點開始擦除。 我糊塗了。 有任何想法嗎?

很容易混淆,但刪除功能並沒有刪除所有的句點。

假設在remove您的字符串之前是"abc"然后在remove之后它將是"abc..." 擦除方法所做的是擦除現在位於字符串末尾的句點。

現在問為什么remove會這樣是一個合理的問題,但是想想remove有什么,它只有一對迭代器。 迭代器不能用於從容器中刪除項目,迭代器不能讓您訪問它所引用的容器。 所以remove (和其他類似的函數)不能從容器中刪除任何東西。 他們所能做的就是重新排列順序,以便稍后的一些代碼可以輕松地進行實際刪除。

這個習語有一個名字,但它現在讓我無法理解。

std::remove作用於一個范圍。 范圍是一對分別表示其beginend的迭代器。

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

從一個范圍中移除一個元素可以被認為是返回一個新的范圍。 例如,您通過將元素放在end從范圍中刪除元素,新范圍是從beginend-1

從容器中擦除元素是不同的。 容器擁有該元素並負責實際“擦除”該元素。

總結:您開始將temp.begin()直到temp.end()組成的范圍內的所有元素傳遞給std::remove ,它返回新范圍的end (在對元素進行混temp.end() ),最后是std::string::erase縮小string以僅包含新的字符范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM