删除vector中的元素
1.删除指定的所有对象
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。例子:
vector<int> vecTemp;
vecTemp.push_back(2);
vecTemp.push_back(4);
vecTemp.push_back(2);
vecTemp.push_back(5);
//原始元素顺序为2,4,2,5
remove(vecTemp.begin(),vecTemp.end(),2);
//remove后的结果为4,5,2,5
可以看到除了前面的4,5是正确的后面的没有用了
若真要删除,则:
vecTemp.erase(remove(vecTemp.begin(),vecTemp.end(),2),vecTemp.end());
//输出结果为4,5
2.如果删除一个元素后要进行其它操作,如写日志等,那么就不能用上面的方法,改用循环,但需要注意,erase()之后的迭代器将失效,而erase()的返回值为当前位置的下一个位置,可以利用其返回值。例子:
vector<int>vecTemp;
vecTemp.push_back(2);
vecTemp.push_back(4);
vecTemp.push_back(2);
vecTemp.push_back(5);
vector<int>::iterator i;
for(i=vecTemp.begin(); i!=vecTemp.end(); )
{
if(*i == 2)
{
i = vecTemp.erase(i);
}
else
{
++i;
}
}
下面的循环是不对的,运行时会出错
vector<int>::iteratori;
for(i=vecTemp.begin(); i!=vecTemp.end(); ++i)
{
if(*i == 2)
{
vecTemp.erase(i);//执行完后i已经失效
}
}
删除list中的元素
1.删除所有指定的对象
list<int> listTemp;
listTemp.push_back(2);
listTemp.push_back(4);
listTemp.push_back(2);
listTemp.push_back(6);
listTemp.push_back(5);
listTemp.remove(2);
2.删除每个元素后,进行其他操作如写日志,输出等,上面的就不能满足要求,需要采用循环,但要注意erase()后迭代器失效的问题,与vector删除时一样。
例子:
list<int> listTemp;
listTemp.push_back(2);
listTemp.push_back(4);
listTemp.push_back(2);
listTemp.push_back(6);
listTemp.push_back(5);
list< int>::iterator k;
for(k=listTemp.begin(); k!=listTemp.end(); )
{
if(*k == 2)
{
cout<<"删除一个元素"<<endl;
k = listTemp.erase(k);
}
else
{
++k;
}
}