1. remove函数

remove是STL中的函数,和erase是有区别的:

(1)erase是容器自带的成员函数,而remove是STL中的函数;

(2)erase是真正的删除,而remove是虚假的删除。(下面会说明)

作用

顾名思义,该函数作用是移除容器中的元素。

参数

参数有三个:
头指针、尾指针和要删除的元素。

int b[] = {1,2,3,4,5,5,6};
vector<int> a(b, b+7);
vector<int>::iterator it1 = remove(a.begin(), a.end(), 5);

返回值

remove返回值为一迭代器,指向删除后的真正结尾。(之后会解释)

2. 错误用法

int b[] = {1,2,3,99,5,99,7,8,9,99};
vector<int> a(b, b+10);
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++)
    cout<<*it<<" ";
cout<<endl;
remove(a.begin(), a.end(), 99);
for(it=a.begin(); it!=a.end(); it++)
    cout<<*it<<" ";
//我们期望的输出:1 2 3 5 7 8 9

我们看实际输出的结果是什么:
在这里插入图片描述
并不是我们想的那样,为什么?

3.remove的执行过程

remove函数并不会“真正地”对特定元素进行删除,它只会移动指定区间中的元素直到所有“不删除的”元素在区间的开头(相对位置不变),并返回此时的newEnd迭代器,newEnd后的元素值保持不变。

示意图:
remove前:
在这里插入图片描述
remove后:
在这里插入图片描述
所以我们说,remove只是虚假的删除,因为容器的size并没有变。

【举例】

int b[] = {1,2,3,99,5,99,7,8,9,99};
vector<int> a(b, b+10);
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++)
    cout<<*it<<" ";
cout<<endl;
vector<int>::iterator newEnd = remove(a.begin(), a.end(), 99);
for(it=a.begin(); it!=newEnd; it++)
    cout<<*it<<" ";
cout<<endl<<a.size();

在这里插入图片描述

4. 如何真正删除

搭配容器自带的erase函数,即可真正删除
【举例】

int b[] = {1,2,3,99,5,99,7,8,9,99};
vector<int> a(b, b+10);
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++)
    cout<<*it<<" ";
cout<<endl;
vector<int>::iterator newEnd = remove(a.begin(), a.end(), 99);
a.erase(newEnd, a.end());
for(it=a.begin(); it!=a.end(); it++)
    cout<<*it<<" ";
cout<<endl<<a.size();

在这里插入图片描述
值得注意的是,list自带有remove成员函数(vector等容器没有),用法和erase+remove相同,且效率更高:
【举例】

list<int> l = {1,2,3,99,5,99,7,8,9,99};
l.remove(99);
for(list<int>::iterator it=l.begin(); it!=l.end(); it++)
    cout<<*it<<" ";
cout<<endl<<l.size();

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐