vector<结构体>中erase的问题,急!! 首先我声明了一个结构体,结构体包含{string,char*},赋值重载,拷贝构造函数,==重载都写了,然后用了vector<结构体>,但是在删除vector中的元素的时候出现问题,我用erase(迭代器)的方式删除vector中任意一个元素,但是删除的结果都是删除掉最后一个元素。求问各位大侠指点,这是怎么回事?急求帮助! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 赋值重载,拷贝构造函数,==重载都可以不写,直接这样用就行了struct TEST{ int a; char* p;};vector<TEST>ts;TEST a;a.a = 1;a.p = "123";ts.push_back(a); 结构体比较复杂,赋值重载和拷贝构造函数必须写,不然增加元素和释放资源的时候会出错。问题发现了,赋值重载函数写错了..没有分清楚蛋和鸡的先后问题。 Suspect& operator=(const Suspect& other) { name=other.name; index=other.index; b=other.b; for (int i=0;i<other.info.size();i++) { SuspectInfo susInfo=other.info[i]; info.push_back(susInfo); } int redu_dim=100; int ori_dim=1600; WMatrix=new double*[redu_dim]; for(i=0;i<redu_dim;i++) { WMatrix[i]=new double[ori_dim]; memset(WMatrix[i],0,ori_dim*sizeof(double)); } for(i=0;i<redu_dim;i++) { memcpy(WMatrix[i],other.WMatrix[i],ori_dim*sizeof(double)); } return *this;// Suspect newOne;// newOne.name=other.name;// newOne.index=other.index;// newOne.b=other.b;// for (int i=0;i<other.info.size();i++)// {// SuspectInfo susInfo=other.info[i];// newOne.info.push_back(susInfo);// }// int redu_dim=100;// int ori_dim=1600;// newOne.WMatrix=new double*[redu_dim];// for(i=0;i<redu_dim;i++)// {// newOne.WMatrix[i]=new double[ori_dim];// memset(newOne.WMatrix[i],0,ori_dim*sizeof(double));// }// for(i=0;i<redu_dim;i++)// { // memcpy(newOne.WMatrix[i],other.WMatrix[i],ori_dim*sizeof(double));// }// return newOne; }其中注释掉的是原来的错误写法,虽然不报错,但是erase的时候每次都擦除vector的最后一个元素 erase怎么都不应该只能删除最后一个啊,你把你erase调用的代码贴出来,是不是你循环时遍历到最后一个了? 贴你调用vector::erase部分的代码 erase可以删除任何元素,是不是你写的有问题呢,贴一下代码,看看你erase怎么用的 erase和迭代器位置都没有问题,是因为赋值重载写得有问题...可以见3楼的代码,大家讨论一下为什么会删除最后一个吧 erase的代码贴出来我们看看综合分析下 我来解释一下吧,经验教训呀。vector中erase的工作原理:vector中{1,2,3,4}个元素,比如我擦除第2个元素,也就是调用erase(2)后,vecotr从被删除元素处开始连续调用赋值重载函数,3-》2,4-》3,然后再删除vector最后一个元素。因为我的赋值重载函数写得有问题(没有生效),所以每次都删除掉了vector最后一个元素,而其他元素没有改变 vector::erase的返回值就是指向被删除的元素的下一个元素的迭代器 恩,这个我知道,我的程序中出现问题迭代器不是关键,因为执行erase之后我就没有再用这个迭代器了。我的错误原因如3楼我所贴的代码,是因为赋值重载函数写错了。总结一下就是,vector<结构体>(结构体中包含指针)如果想要正确使用,必须要保证拷贝构造函数,赋值重载函数,析构函数都正确实现,不然会出现浅拷贝或者内存泄露等等问题。 坛友们真热心,新发个帖问下如何在MFC图形界面程序里暂停主线程。。 VC++6.0EXE文件图标问题 __asm 初次用mfc实现upd通信就遇到问题了......... 如何将这个值传递出去? 开发一个简单的语音视频工具,但并不简单!急等专家!高手!200分 有谁用GDI+作过图形实时显示方面的系统。来讨论一下GDI+和GDI图形处理效率的问题。 在应用程序中怎么启动屏幕保护程序? CSocket服务器 两个Formview之间怎么实现参数传递 如何获取带滚动条的窗口当前可见范围的尺寸 求助,关于如何做类似风扇的旋转按钮,请指教!!
struct TEST
{
int a;
char* p;
};vector<TEST>ts;
TEST a;
a.a = 1;
a.p = "123";
ts.push_back(a);
Suspect& operator=(const Suspect& other)
{
name=other.name;
index=other.index;
b=other.b;
for (int i=0;i<other.info.size();i++)
{
SuspectInfo susInfo=other.info[i];
info.push_back(susInfo);
}
int redu_dim=100;
int ori_dim=1600;
WMatrix=new double*[redu_dim];
for(i=0;i<redu_dim;i++)
{
WMatrix[i]=new double[ori_dim];
memset(WMatrix[i],0,ori_dim*sizeof(double));
}
for(i=0;i<redu_dim;i++)
{
memcpy(WMatrix[i],other.WMatrix[i],ori_dim*sizeof(double));
}
return *this;
// Suspect newOne;
// newOne.name=other.name;
// newOne.index=other.index;
// newOne.b=other.b;
// for (int i=0;i<other.info.size();i++)
// {
// SuspectInfo susInfo=other.info[i];
// newOne.info.push_back(susInfo);
// }
// int redu_dim=100;
// int ori_dim=1600;
// newOne.WMatrix=new double*[redu_dim];
// for(i=0;i<redu_dim;i++)
// {
// newOne.WMatrix[i]=new double[ori_dim];
// memset(newOne.WMatrix[i],0,ori_dim*sizeof(double));
// }
// for(i=0;i<redu_dim;i++)
// {
// memcpy(newOne.WMatrix[i],other.WMatrix[i],ori_dim*sizeof(double));
// }
// return newOne; }
其中注释掉的是原来的错误写法,虽然不报错,但是erase的时候每次都擦除vector的最后一个元素
总结一下就是,vector<结构体>(结构体中包含指针)如果想要正确使用,必须要保证拷贝构造函数,赋值重载函数,析构函数都正确实现,不然会出现浅拷贝或者内存泄露等等问题。