C++之vector的erase使用
一、定义vector::erase 从指定容器删除指定的元素两个重载:iterator erase (iterator position);删除指定位置position的元素,并返回删除元素的下一个元素的迭代器,源码iterator erase(iterator position){//清除某个位置上的元素if(position+1!=end())copy(position+1,finish,po
·
一、定义
vector::erase 从指定容器删除指定的元素
两个重载:
iterator erase (iterator position);
删除指定位置position的元素,并返回删除元素的下一个元素的迭代器
iterator erase(iterator position){//清除某个位置上的元素
if(position+1!=end())
copy(position+1,finish,position);//后续元素向前移动
--finish;
destory(finish);//全局函数
return position;
}
iterator erase (iterator first, iterator last);
删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器
//清除[ first,last)中的所有元素
iterator erase(iterator first, iterator last)
{
iterator i=copy(last,finish,first);//copy是全局函数
destroy(i, finish);// destroy是全局函数
finish = finish-(last - first);
return first;
}
二、实例
我们要删除数组中的某个数字,比如删除300,有如下三种写法
2.1、错误的使用实例
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for (itor = array.begin(); itor != array.end(); itor++){
if (*itor == 300)
array.erase(itor);//直接删除等于300的元素
}
for (itor = array.begin(); itor != array.end(); itor++)
{
cout << *itor << " ";
}
运行结果
以上代码是错误的,因为删除一个元素之后,迭代器已经指向了被删除元素的下一个元素,再进行itor++会出现野指针。也就是说array.erase(itor)后,itor的状态是不确定的,再进行++,岂有不崩溃的道理?!
2.2错误的使用实例
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for (itor = array.begin(); itor != array.end(); itor++){
if (*itor == 300) itor=array.erase(itor);
}
for (itor = array.begin(); itor != array.end(); itor++)
{
cout << *itor << " ";
}
运行结果
还是不对,结果发现是100 300 300 500,因为itor指向删除元素下一个元素后,itor++就跳过了删除元素,而指向下一个元素。
2.3正确的写法
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for (itor = array.begin(); itor != array.end(); ){
if (*itor == 300)
{
itor=array.erase(itor);
}
else
{
itor++;
}
}
for (itor = array.begin(); itor != array.end(); itor++)
{
cout << *itor << " ";
}
运行结果
也就是说如果没有erase操作,再将迭代器指向下一个元素。
参考:
更多推荐
已为社区贡献2条内容
所有评论(0)