《从缺陷中学习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不允许元素重复。这会给一些操作带来不同的影响。

multiset容器erase函数的误用的更多相关文章

  1. C++ - 容器(container)的erase()函数

    容器(container)的erase()函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23996013 容器(contai ...

  2. 在容器中使用erase函数,迭代器的处理

    在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数:   返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...

  3. STL学习系列八:Set和multiset容器

    1.set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...

  4. STL之Set和multiset容器

    1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...

  5. STL容器能力一览表和各个容器操作函数异常保证

    STL容器能力一览表 Vector Deque List Set Multiset map Multimap 典型内部 结构 dynamic array Array of arrays Doubly ...

  6. C++ STL 学习笔记__(7)Set和multiset容器

    10.2.8 Set和multiset容器 set/multiset的简介 ²  set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指 ...

  7. STL Set和multiset 容器

    STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...

  8. STL中各容器之函数总结

    一.序列和关联非共同拥有函数 全部标准库共同拥有函数  (构造,相关属性,迭代器,插入与删除,比較.swap) 当中operator>,operator>=,operator<,op ...

  9. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

随机推荐

  1. MyBatis工程搭建&MyBatis实现Mapper配置查询

    一.MyMyBatis工程搭建 新建Maven项目:mybatis-demo 准备数据源 1 # 删除mybatis_demo数据库 2 drop database if exists mybatis ...

  2. PureStudy:学科知识分享——个人网站开发全解

    PureStudy:学科知识分享--个人网站开发全解 项目描述 PureStudy,学科知识分享网站. 学生可以使用这个网站,来浏览相应学科的知识点.学习总结,获取相关的资料.此外,他们可以选择上传文 ...

  3. 学会使用 Mysql show processlist 排查问题

    mysql show full processlist 查看当前线程处理情况 事发现场 每次执行看到的结果应该都有变化,因为是实时的,所以我定义为:"事发现场",每次执行就相当于现 ...

  4. 想要更高效地找到信息,你需要掌握这些搜索技巧 (google or baidu)

    想要更高效地找到信息,你需要掌握这些搜索技巧 (google or baidu) 转载:https://tingtalk.me/search-tips/ 在大型局域网(互联网)的今天,你以为搜索是一门 ...

  5. 前端开发面试题 — css篇

    1.介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(content).填充(padding).边界(mar ...

  6. 01_pytorch和tensorflow的区别

    Pytorch和TensorFlow的区别 目录 引言 pytorch和tensorflow的功能 torch和tf的区别 torch tf Torch和tf到底用哪个 总结 引言 在这里,我们长话短 ...

  7. OO电梯系列总结与反思

    目录 前言 HW5 度量分析 UML类图与协作图 bug分析 HW6 度量分析 UML类图与协作图 bug分析 HW7 度量分析 UML类图与协作图 bug分析 SOLID原则 感想 前言 紧张刺激的 ...

  8. Android通过Web与后台数据库交互

    2021.1.27 更新 已更新新版本博客,更新内容与原文章相比有点多,因此新开了一篇博客,请戳这里. 1 背景 开发一个App与后台数据库交互,基于MySQL+原生JDBC+Tomcat,没有使用D ...

  9. manjaro 手动调节屏幕亮度

    1 问题描述 manjaro版本20.0,桌面XFCE,设置之类的地方没有屏幕亮度调节的功能. 2 解决方案 解决方案来自arch wiki. 亮度由ACPI内核模块控制,这个模块的接口在以下位置: ...

  10. JetBrains系列IDE无法输入中文

    1 问题描述 环境Linux+fcitx,JetBrains的IDE无法输入中文,包括IDEA,PyCharm,WebStorm,CLion等等. 2 解决方案 Linux下一般使用fcitx进入中文 ...