紧接着上面几个转载的内容来写。只是这次写的是自己的使用。
由于stl中的remove函数是algorithm中的一个,因此在使用remove之前必须将该头文件库包含进来。
在remove中有三个参数,第一个第二个分别是要操作的指针范围,第三个参数是元素内容。
template < class ForwardIterator, class T >
ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value )
{
ForwardIterator result = first;
for ( ; first != last; first)
if (!(*first == value)) *result = *first;
return result;
}
那么在使用中,如果有个vector变量中有若干个相同值的地方,而我们不想同时删除,因为有时候需要有些额外的操作,怎么办呢?
改变remove的三个参数中的指针范围,当然只能这么办。我用的方法是从后往前走,这样的话,就从后往前一个一个的删除。
#include <iostream.h>
#include <vector>
#include<algorithm>
using namespace std;
void main()
{
int i;
vector<int> arr;
for (i=0; i<10; i++)
{
arr.push_back(i);
if ((i%3==0))
{
arr.at(i)= 0;
}
}
cout << " before deleted , size = " << arr.size() << endl;
for ( i = 0; i < arr.size(); i++ )
{
cout << "i = " << i << " , " << arr[i] << endl;
}
vector<int>::iterator iter;
for (iter = arr.end()-1; ; iter--)
{
if ((*iter == 0))
{
arr.erase(remove(iter,arr.end(),0),arr.end());
// other compliments.
//
break;
}
if (iter==arr.begin())
{
break;
}
}
// arr.erase(remove(arr.begin(),arr.end(),0),arr.end());
cout << " after deleted , size = " << arr.size() << endl;
for ( i = 0; i < arr.size(); i++ )
{
cout << "i = " << i << " , " << arr[i] << endl;
}
}
这样子实验后,只删除了最后一个为0的元素。当然,如果需要删除完,则把break去掉即可。而在删除每个值为0的元素后,如果需要有其它操作的话,则在break前添加上相应的操作即可。
关键是充分理解remove和erase中每个参数的意义。