remove_if(begin,end,p)
begin、end: 容器的範圍迭代器,表示在這個範圍內移除
p:謂詞參數,remove_if會移除謂詞參數爲true的元素
起源
<<C++ Primer>> 11章練習11.4,刪除string中的標點符號。
思路
使用泛型算法中的remove_if()進行刪除。
while (cin >> word)
{
for (auto &ch : word) ch = tolower(ch);
// ispunct 檢查是否爲標點符號的可調用函數
remove_if(word.begin(), word.end(), ispunct);
}
在運行上述代碼後,發現原string並沒有刪除標點符號。比如輸入 ZerLin.,輸出結果爲 Zerlin.,希望結果 Zerlin。後來通過翻閱博客發現:
remove_if()返回一個指向被修剪的序列的最後一個元素迭代器.。remove_if()並不會實際移除序列[start, end)中的元素,所有的元素都還在容器裏面。 實際做法是,remove_if()將所有應該移除的元素都移動到了容器尾部並返回一個分界的迭代器。 移除的所有元素仍然可以通過返回的迭代器訪問到。爲了實際移除元素,你必須對容器自行調用erase()以擦除需要移除的元素.
這讓我想起了<<C++ Primer>>中的一段話:
標準庫算法對迭代器而不是容器進行操作。因此,算法不能(直接)添加或刪除元素。
修改代碼:
while (cin >> word)
{
for (auto &ch : word) ch = tolower(ch);
word.erase(remove_if(word.begin(), word.end(), ispunct));
}
可以實現刪除string中標點符號的功能。
總結
一定要充分理解標準庫算法,標準庫算法對迭代器而不是容器進行操作。因此,算法不能(直接)添加或刪除元素。
引用
- <<C++ Primer>>
- CSDN博客:CSDN博客