none
关于Vector的erase 和赋值的问题 RRS feed

  • 问题

  • 定义了一个vector,里面装push_back了4个结构体,在一个for循环里进行了erase和赋值

    struct lollist
    {
       CString br;
       CString ky;
    }lolist;

    std::vector<lolist> V_Vector;


     V_Vector v_ver;

    for(int  i = v_ver.size()-1 ; i >-1; i--)
    {
        if(v_ver[i].br =="SH")
         {
            v_ver.erase(&v_ver[i]);
         }

        if(v_ver[i].br =="GZ")
        {
           v_ver[i].ky="HP";
        }

    }
    一开始在容器内的 br 是

    GZ
    SH
    GZ
    GZ

    结果执行时,后面两个GZ赋值完毕,第二个被earse,本以为结果上 ky字段 应该是
    HP
    HP
    HP
    但结果上遍历出的结果是
    HP

    HP
    第二个是空的,是不是要先赋值再earse?

    2009年8月20日 7:21

答案

  • std::vector<lolist> V_Vector;


     V_Vector v_ver;
    这个是什么意思?
    typedef std::vector<lolist> V_Vector;?
    代码出现这个错误我觉得可能是由于混淆了dereference和iterator的区别。在这里 &v_ver[i]是容器中元素的地址。而iterator可能不是这个地址。
    你用iterator遍历拭一下。

    麻烦把正确答案设为解答。
    • 已标记为答案 scate233 2009年8月21日 7:22
    2009年8月20日 8:44
    版主
  • erase会移动元素指针,不要跟erase一起使用. 可以用v_ver.erase(remove(...))的方式来删除br为"SH"的元素.
    • 已标记为答案 scate233 2009年8月21日 7:22
    2009年8月21日 6:21

全部回复

  • std::vector<lolist> V_Vector;


     V_Vector v_ver;
    这个是什么意思?
    typedef std::vector<lolist> V_Vector;?
    代码出现这个错误我觉得可能是由于混淆了dereference和iterator的区别。在这里 &v_ver[i]是容器中元素的地址。而iterator可能不是这个地址。
    你用iterator遍历拭一下。

    麻烦把正确答案设为解答。
    • 已标记为答案 scate233 2009年8月21日 7:22
    2009年8月20日 8:44
    版主
  • 就是说earse掉的那个东西还在?

    2009年8月21日 1:11
  • 遍历看看br
    麻烦把正确答案设为解答。
    2009年8月21日 2:21
    版主
  • erase会移动元素指针,不要跟erase一起使用. 可以用v_ver.erase(remove(...))的方式来删除br为"SH"的元素.
    • 已标记为答案 scate233 2009年8月21日 7:22
    2009年8月21日 6:21