学习了这么久的C++变准库,怎么还不会正确的插入和移除元素呢?之前移除特定值的元素,我们通过算法earse()和remove()都能成功执行了,可是对于这些算法来说,内部迭代器怎么工作,我们不需要管,只知道对于序列式容器,它会遍历整个容器,找到符合条件的元素并移除,对于关联式容器,可以在对数时间里移除特定值的元素,移除满足特定条件的元素,同样需要遍历整个容器。
那么,现在如果要移除并输出要移除的所有元素呢?
对着,先输出容器中的元素,然后移除它,不管是什么容器,都需要遍历所有元素,并且对每个元素执行earse(),那么这就需要我们自己管理迭代器,还记得吗?之前一直强调的迭代器失效问题,我们稍不留神,就会掉进这个陷阱。
示例代码:
//移除元素,在移除前先输出元素
#include<iostream>
#include<vector>
#include<set>
#include<iterator>
using namespace std;
int main()
{
int data[]={-2,3,0,9,12,-5,-1,7};
vector<int> coll(data,data+sizeof(data)/sizeof(data[0]));
vector<int>::iterator pos;
for(pos=coll.begin();pos!=coll.end();)
{
cout<<*pos<<" ";
pos=coll.erase(pos);//删除该元素,并返回下一元素的位置 这样迭代器不会失效,并指向下一位置
}
cout<<endl;
set<int> coll1(data,data+sizeof(data)/sizeof(data[0]));
set<int>::iterator pos1;
for(pos1=coll1.begin();pos1!=coll1.end();)
{
cout<<*pos1<<" ";
coll1.erase(pos1++);//删除该元素后,该迭代器失效,可是pos1已经指向下一元素位置
}
cout<<endl;
vector<int> s;
vector<int>::iterator p=s.begin();
for(int i=0;i<10;i++)
{
p=s.insert(p,i);//正确的插入方法
++p;
}
copy(s.begin(),s.end(),ostream_iterator<int>(cout," "));
cout<<endl;
system("pause");
return 0;
}
代码分析:
从上面的代码可以看出,对于序列式容器,它的成员函数earse()和insert()是有返回的,成员函数earse()返回被删除元素的下一位置,而insert()则返回刚插入的元素的位置,这样通过对迭代器处理可以避免出错;对于关联式容器,必须采用后置递增,这样才
不会使迭代器失效。