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