STL函数——remove函数
目录1. remove函数2. 错误用法3.remove的执行过程4. 如何真正删除1. remove函数remove是STL中的函数,和erase是有区别的:(1)erase是容器自带的成员函数,而remove是STL中的函数;(2)erase是真正的删除,而remove是虚假的删除。(下面会说明)作用顾名思义,该函数作用是移除容器中的元素。参数参数有三个:头指针、尾指针和要删除的元素。int
·
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();
更多推荐
已为社区贡献1条内容
所有评论(0)