泛型编程中的remove方法

最近看模板类的时候,用到了泛型编程中的remove方法,搜索了一下,自己折腾了一番,总算搞清楚了remove方法,写下来和大家一起分享,同时也可以增加一下记忆

关于泛型编程中的remove方法,官方给的模版类定义如下:

1
2
template < class ForwardIterator, class T >
ForwardIterator remove ( ForwardIterator first, ForwardIterator last,const T& value );

说简单点就是remove接受三个参数,前两个迭代器或者指针表示一个范围,最后一个数,代表要从前面的范围中“移除”的值,这个方法不难理解,看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

void print(vector<int>);

int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(3);

//删除array中的所有6
vector<int>::iterator itor;
itor=array.begin();
array.erase(remove(array.begin(),array.end(),6),array.end());

print(array);
return 0;
}
void print(vector<int> v)
{
cout<<"vector size is:"<<v.size()<<endl;
vector<int>::iterator p = v.begin();
for(;p!=v.end();p++)
cout<<*p<<endl;
}

需要注意的是remove不是容器模版类vector专有的方法,而是泛型方法,所以需要加入头文件#include<algorithm>这个容器的输出结果是

主要是因为erase方法把后面的元素真正删除了
那么我们再看一下下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(3);

vector<int>::iterator itor;
vector<int>::iterator itor2;
itor=array.begin();
itor2=array.begin();
for(;itor!=array.end();itor++)
    cout<<*itor<<" ";
cout<<endl;
remove(array.begin(),array.end(),6);
for(;itor2!=array.end();itor2++)
    cout<<*itor2<<" ";
cout<<endl;
cout<<"vector size is:"<<array.size()<<endl;
return 0;
}

执行之后我们发现,remove并没有把元素真正删除,只是被后面的元素覆盖了,首先遇到第一个6的时候,然后3将6覆盖,后面因为除了6就没有其它元素了,所以后面的元素就不再处理由于第一个6被覆盖,所以后面的两个元素仍然是6和3,而且remove返回的是指向后面那些被移除的元素的首元素,本例中指向6,于是上面的一个例子,删除remove的返回值和array.end()中的数,就把后面的6和3删除了,于是输出的是1 3