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())
但是问题在于如何确定删除之后的有效指针呢?
暂时无解