admin 管理员组文章数量: 887006
C++ remove
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博客
本文标签: C remove
版权声明:本文标题:C++ remove 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732351397h1533169.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论