读书人

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

发布时间: 2013-09-09 20:31:09 作者: rapoo

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++;
}
}
}
}

读书人网 >C++

热点推荐