读书人

急问为什么vector调用erase()时出错

发布时间: 2012-03-11 18:15:39 作者: rapoo

急问,为什么vector调用erase()时出错说内存不能为read
要执行的代码如下:

(1)Element e(minsup);
(2)vector <Element> ::iterator newEnd=remove(header.begin(),header.end(),e);
(3)header.erase(newEnd,header.end());
运行到(3)时就抱错,说“**内存不能为read”。

其中,
header定义为:
vector <Element> header;
Element定义为:
class Element
{
public:
Element(){next=0; end=0;}
Element(int sup){support=sup; next=0; end=0;}
~Element()
{
}
bool operator < (const Element &e) const {return support > e.support;}
bool operator==(const Element& e)
{
return support < e.support;
}

int support;
Item *next;
Item *end;
};

Item的定义:
class Item
{
public:
Item(int newId, int newSupport){id=newId; support=newSupport;next=0; parent=0;}
~Item(){}
void addChild(Item *item) {children.insert(item);}

int id; //节点id。
int support; //结点支持度
Item *next; //指针链上的下一个节点。
Item *parent; //父节点。
set <Item *> children; //子结点的集合。

};


我的header中有一些元素,我要将header中的Element的support小于一定值的Element都erase掉。但是程序运行时提示说内存不能为read。后来又发现,如果我从remove操作返回的iterator处开始到header的结尾,一个一个的erase,有的可以顺利erase,有的不行。
请各位大侠帮忙啊。


[解决办法]
erase会导致所有它后面的iterator失效
所以,看Effective STL,使用v.erase(remove(v.begin(), v.end(), X), v.end);技术
[解决办法]
我觉得楼主的写法没什么错啊,F11跟进去看看嘛。
[解决办法]
还是把完整代码贴上来,比如header如何填充的,如何删除的。

读书人网 >C++

热点推荐