首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

list的删除remove与erase的有关问题

2012-02-10 
list的删除remove与erase的问题DrawDataJjlist DrawData ::iteratorpfor(pTempPathDatList.begin()p

list的删除remove与erase的问题
DrawData   Jj;

list <DrawData> ::iterator   p;    
for(p=TempPathDatList.begin();p!=TempPathDatList.end();p++)
{
Jj=*p;//读链表中
switch(Jj.Type)
{
case   'A ':
{
if((fabs(FrontPathPoint.Xx-Jj.Dat.ARC.x2) <=eps)&&(fabs(FrontPathPoint.Yy-Jj.Dat.ARC.y2) <=eps))
{
TempPathDatList.erase(p);//会死机

                  TempPathDatList.remove(Jj);//会出错  
}

}   break;
}
用erase会死机;
用remove会:[C++   Error]   _list.h(473):   E2093   'operator== '   not   implemented   in   type   'DrawData '   for   arguments   of   the   same   type


typedef   struct
{
        short   ColorPen;//笔色
short   ColorBrush;//填充刷颜色
short   LineWide;//线宽度
short   LineType;//线型
short   Layer;//所处层
//bool   Delete;//是否处于删除状态
char   Type;//类型标志:元素名称
int   id_only;//图形元素唯一的识别号
union
{
                                struct
{
float     x0,y0,x1,y1,x2,y2,r,length,angle_s,angle_e;//圆心,起点,终点
char   NS;//逆顺标志
}ARC;//圆弧

}Dat;
}DrawData;


如何现实正确的删除


[解决办法]
把TempPathDatList.erase(p);改成
p=TempPathDatList.erase(p); p--;
试试,可能把p位置删除了以后p本身就无效了,导致后面的p++出错.

如果还不行的话,就在DrawData里写一个
bool operator ==(const DrawData &data) const
{
return memcmp(this,&data,sizeof(data))==0;
}
另外把typedef去掉,改成struct DrawData{....};
再用remove,不过这个效率不高

热点排行