STL各種容器如何正確的erase

2021-06-22 09:08:44 字數 1199 閱讀 1233

分類: c++基礎

2014-05-14 10:52

41人閱讀收藏 

舉報stl erase vector刪除 c

stl中

結點類容器(如:list,hash_map)遍歷時進行刪除

時,需要這樣做: 

for(list ::iterator   iter   =   m_list.begin();   iter   !=   m_list.end();   ) 

else 

++iter; 

} 而不能這樣: 

for(list ::iterator   iter   =   m_list.begin();   iter   !=   m_list.end();   ++iter)  } 

對於非結點類,如

陣列類的容器vector,string,deque

,如果erase會返回下個有效的iterator,可以這樣處理: 

for(vector ::iterator   iter   =   m_vector.begin();   iter   !=   m_vector.end();) 

else 

++iter; }

為什麼呢? 

以stl   list為例: 

iterator的相關操作 

_self&   operator++() 

_self   operator++(int) 

void   _m_incr()           //++的操作對於list結構來說,就是使iterator的_m_node指向下乙個結點 

iterator   erase(iterator   __position) 

分析**我們可以看出,erase會deallocate__position的_m_node,   在__position上再進行++是錯誤的。 

所以不能在m_list.erase(iter)後,進行iter++. 

哪為什麼m_list.erase(iter++)可以呢?為什麼不能用m_list.erase(++iter)? 

參照operator++的**我們可以找到答案,iter++返回了++之前的iter值,erase使用這個值能正確進行__position的前後結點的串接及刪除正確的結點,而++iter返回的是++之後的iter,所以m_list.erase(++iter)串接不正確,iter-> _m_node也是失效的. 

STL 各種容器

c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 4.stack 底層一般用23實現,封...

STL各種容器的區別

容器名名稱 資料結構 效能備註 string 通用字串庫 連續存放的記憶體塊 有保留記憶體 堆中分配記憶體 高效率的隨機訪問 o 1 的訪問時間 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 支援操作 vector 通用向量 陣列 庫 變長一維陣列...

STL中各種容器效率

2.deque 動態陣列 deque支援隨機訪問。在deque的首端和末端插入和刪除元素比較快,在中部插入和刪除則比較慢。deque的記憶體重分配效能比vector好。3.list 雙向鍊錶 list不支援隨機訪問。list在任何位置安插和刪除元素速度都比較快 雙向鍊錶 list的安插和刪除操作不會...