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不允許元素重復。這會給一些操作帶來不同的影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM