《从缺陷中学习C/C++》第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题。使用库函数可以降低软件开发的难度,提高代码编写的效率。本节为大家介绍multiset容器erase函数的误用。

AD: 51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验

 

3.16  multiset容器erase函数的误用

代码示例

  1. int main(){
  2. multiset <int> c1;
  3. c1.insert(3);
  4. c1.insert(2);
  5. c1.insert(3);
  6. c1.insert(3);
  7. c1.insert(5);
  8. int x=3;
  9. c1.erase(x);//remove one element with value 3
  10. for(multiset <int>::iterator it = c1.begin(); it != c1.end(); it++)
  11. {
  12. cout  << *it  << endl;
  13. }
  14. return 0;
  15. }

现象&后果

代码期望删除一个值为3的元素,但实际运行结果显示删除了所有值为3的元素。

Bug分析

multiset带一个参数的erase函数原型有两种。一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数;另外一种是传递一个指向某个元素的iterator,这时候删除的就是这个对应的元素,无返回值。用户需要根据自己的应用场景,正确调用对应的原型。例子代码中本意是想删除一个元素,但实际上是删除了所有值为3的元素,不符合预期。

正确代码

  1. int main(){
  2. multiset <int> c1;
  3. c1.insert(3);
  4. c1.insert(2);
  5. c1.insert(3);
  6. c1.insert(3);
  7. c1.insert(5);
  8. int x=3;
  9. multiset <int>::iterator pos = c1.find(x);
  10. c1.erase(pos);//remove one element with value 3
  11. for(multiset <int>::iterator it = c1.begin(); it != c1.end(); it++)
  12. {
  13. cout  << *it  << endl;
  14. }
  15. return 0;
  16. }

编程建议

在使用multiset的时候,需要注意mutilset与普通set容器的主要区别,即multiset允许元素重复,set不允许元素重复。这会给一些操作带来不同的影响。

最新文章

  1. System进程(pid=4)占用80端口的解决方案
  2. 第6章 第一个Linux驱动程序:统计单词个数
  3. VS2008 查找 替换对话框无法打开的解决方法
  4. Set
  5. com.alibaba.fastjson.JSONObject学习
  6. android中的数据库操作
  7. linux命令(13) 删除指定文件夹下后缀名相同的文件
  8. 给sqlserver配置内存参数
  9. centos 安装RAR
  10. Flink资料(8) -- Flink代码贡献的指导及准则
  11. JTree
  12. crontab 定时的陷阱
  13. IDEA使用01 创建java项目、创建web项目
  14. Linux-chown命令(1)
  15. XCode8中的sizeClass设置
  16. 51NOD 1584&#160;加权约数和 [莫比乌斯反演 转化 Trick]
  17. node加密
  18. bzoj5049: 导航系统
  19. Python(算法)-时间复杂度和空间复杂度
  20. vue中使用elementui里的table时不被选中设置

热门文章

  1. python2 虚拟环境
  2. javaIO中的序列化和反序列化
  3. 真会C#微信小程序的习题数据JSON文件下载链接
  4. 001-Java学习前基础
  5. Android 之 手动创建活动
  6. 用python连接数据库模拟用户登录
  7. 死磕Spring之AOP篇 - Spring AOP常见面试题
  8. Qt开发技术:图形视图框架(一)基本介绍
  9. 《C标准库》学习笔记整理
  10. Day06_30_抽象类(Abstract)