multiset容器erase函数的误用

Posted lakeone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了multiset容器erase函数的误用相关的知识,希望对你有一定的参考价值。

《从缺陷中学习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函数的误用的主要内容,如果未能解决你的问题,请参考以下文章

C++ stl multiset.erase的误用

STL——容器(Set & multiset)的删除 erase

STL——容器(Set & multiset)的删除 erase

cpp►STL容器->排序容器->multiset

C++ multiset erase会删除所有元素

C++ STL multiset容器