C++ remove_if()

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中标点符号的功能。

总结

一定要充分理解标准库算法,标准库算法对迭代器而不是容器进行操作。因此,算法不能(直接)添加或删除元素。

引用

  1. <<C++ Primer>>
  2. CSDN博客:CSDN博客
发布了3 篇原创文章 · 获赞 21 · 访问量 5045
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章