首先我声明了一个结构体,结构体包含{string,char*},赋值重载,拷贝构造函数,==重载都写了,然后用了vector<结构体>,但是在删除vector中的元素的时候出现问题,我用erase(迭代器)的方式删除vector中任意一个元素,但是删除的结果都是删除掉最后一个元素。求问各位大侠指点,这是怎么回事?急求帮助!

解决方案 »

  1.   

    赋值重载,拷贝构造函数,==重载都可以不写,直接这样用就行了
    struct TEST
    {
    int a;
    char* p;
    };vector<TEST>ts;
    TEST a;
    a.a = 1;
    a.p = "123";
    ts.push_back(a);
      

  2.   

    结构体比较复杂,赋值重载和拷贝构造函数必须写,不然增加元素和释放资源的时候会出错。问题发现了,赋值重载函数写错了..没有分清楚蛋和鸡的先后问题。
    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的最后一个元素
      

  3.   

    erase怎么都不应该只能删除最后一个啊,你把你erase调用的代码贴出来,是不是你循环时遍历到最后一个了?
      

  4.   

    贴你调用vector::erase部分的代码
      

  5.   

    erase可以删除任何元素,是不是你写的有问题呢,贴一下代码,看看你erase怎么用的
      

  6.   

    erase和迭代器位置都没有问题,是因为赋值重载写得有问题...可以见3楼的代码,大家讨论一下为什么会删除最后一个吧
      

  7.   

    erase的代码贴出来我们看看综合分析下
      

  8.   

    我来解释一下吧,经验教训呀。vector中erase的工作原理:vector中{1,2,3,4}个元素,比如我擦除第2个元素,也就是调用erase(2)后,vecotr从被删除元素处开始连续调用赋值重载函数,3-》2,4-》3,然后再删除vector最后一个元素。因为我的赋值重载函数写得有问题(没有生效),所以每次都删除掉了vector最后一个元素,而其他元素没有改变
      

  9.   

    vector::erase的返回值就是指向被删除的元素的下一个元素的迭代器
      

  10.   

    恩,这个我知道,我的程序中出现问题迭代器不是关键,因为执行erase之后我就没有再用这个迭代器了。我的错误原因如3楼我所贴的代码,是因为赋值重载函数写错了。
    总结一下就是,vector<结构体>(结构体中包含指针)如果想要正确使用,必须要保证拷贝构造函数,赋值重载函数,析构函数都正确实现,不然会出现浅拷贝或者内存泄露等等问题。