remove
算法描述:查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素,也就是说,所有和value相
同值的元素都会被覆盖,而其他的元素都会依次前移。最后remove返回"指向最后一个 '有用'
元素的iterator",但是在remove算法过程中,并没有修改原容器的size,以及end()。但是从逻辑角度看,最后的[
从remove得到的iterator---_result, 容器的结尾end() )
这个区间里面的元素已经没有意义了。所以这些元素不应该属于该容器了。remove算法能做的仅此而已,并没有删除这些无用的元素。
结论:移除容器里面的元素不应该使用remove算法,而是容器自己的方法erase()。
erase使用:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> arr;
arr.push_back(6);
arr.push_back(7);
arr.push_back(8);
arr.push_back(9);
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
{
if(* it == 8)
{
it = arr.erase(it);
}
else
{
++it;
}
}
//注意上面不能写成
/*
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++)
{
if(* it == 8)
{
arr.erase(it); //在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。
}
}
*/
}