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

Vector 删除元素,百度了半天还是解决不了!

2013-09-09 
Vector 删除元素,百度了半天还是解决不了!!!求助!!!如题,vector删除,帮帮看看那里错了?//SamePnt_I为 int

Vector 删除元素,百度了半天还是解决不了!!!求助!!!
如题,vector删除,帮帮看看那里错了?


//SamePnt_I为 <int>vector ,里面为数字,1,2,3
//ResultVec[j].PntID、ResultVec[i].PntID也为 int型vector
//目的,从ResultVec[j].PntID里面删除SamePnt_I里面的元素,加入ResultVec[i].PntID里面
int SameI=SamePnt_I.size();
if(SameI>5)
{
      for(int K=0;K<SameI;K++)
      {
          int tmpID=SamePnt_I[K];
          ResultVec[i].PntID.push_back(tmpID);    //ResultVec[i]里面添加,ResultVec[J]里面删除

           for (vector<int>::iterator it = ResultVec[j].PntID.begin(); it != ResultVec[j].PntID.end();)   //for循环中不要it++
      {
     if (*it == tmpID)
       {
            ResultVec[j].PntID.erase(it++);
         }
        else
        {
       it++;
        }
            }
       }
  }


[解决办法]

ResultVec[j].PntID.erase(it++);
//当你做erase操作的时候迭代器已经失效了,需要重新申请的,
// it++ 是没有效果的!

[解决办法]
对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。但erase方法可以返回下一个有效的iterator
可以这样改:
for (iter = cont.begin(); iter != cont.end();)
{
   (*it)->doSomething();
   if (shouldDelete(*iter))
      iter = cont.erase(iter); 
   else
      ++iter;
------解决方案--------------------


你的逻辑等价于下面的代码,何必自找麻烦呢。

if (*it == tmpID)
               {
                    ResultVec[j].PntID.erase(it);
                }

               it++;
}

[解决办法]
int SameI=SamePnt_I.size();
if(SameI>5)
{
      for(int K=0;K<SameI;K++)
      {
          int tmpID=SamePnt_I[K];
          ResultVec[i].PntID.push_back(tmpID);    //ResultVec[i]里面添加,ResultVec[J]里面删除
 
           for (vector<int>::iterator it = ResultVec[j].PntID.begin(); it != ResultVec[j].PntID.end();)   //for循环中不要it++
          {
             if (*it == tmpID)
               {
                    it = ResultVec[j].PntID.erase(it);
                 }
                else
                {
                   it++;
                }
            }
       }
  }

热点排行