分類: 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的安插和刪除操作不會...