理解stl中的erase
vec.push_back(new Path);
?vec.erase(vec.begin());
 
vector<Path > vec;
 vec.push_back(Path());
 
?vec.erase(vec.begin());
erase和clear的機制是這樣的,如果元素是指針,或者其他基本數據類型,則不進行處理;如果是類,要先調用對象的析構函數,再調整容器的大小。
 
對于第一段代碼會有內存泄露,并且erase時也不會調用Path的析構函數
 
第二段代碼在erase時,調用Path的析構函數
 
對于優先隊列priority_queue ?que而言,如果元素是指針,并要把頭結點刪除,如果這樣做
delete que.top()
que.pop()
 
pop()的內部是如何實現的呢?
void pop() {
pop_heap(c.begin, c.end(), comp)
c.pop_back()
}
 
注意優先隊列是基于vector實現的
具體算法有空要好好想想的
如果先把top()的值給釋放了,在pop的時候就可能出錯
正確的做法是
Path *t = que.top();
que.pop()
delete t
 
在stl中,如果容器是有序的,并且元素是指針,在刪除元素的時候要小心
 
又如,multiset<Path*, Cmp> mp;
如果要保留前count的元素
Path::Mp::iterator it =mp.begin();
 ? ? int count = 10;
 ? ??
 ? ? for (int i = 0; i < count; ++i, ++it);
 
 
 ? ? for(;it != mp.end();) {
 ? ? ? ? Path* p = *it;
 ? ? ? ? mp.erase(it++);
 ? ? ? ? delete p;
 ? ? }
 
 
如果想用reverse_iterator,暫時想不到漂亮的解法
 
erase不能刪除reverse_iterator,所以要轉化
通常,reverse_iterator的base()會返回其iterator,但是位置在reverse_iterator的后面一位
所以mp.erase((++re_it).base())
或者mp.erase(--re_it.base())
但是問題在于如何確定刪除之后的有效指針呢?
暫時無解
 
總結
以上是生活随笔為你收集整理的理解stl中的erase的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        