STL:remove和erase区别

C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢?

vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size

vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size

list容器中的remove 成员函数,原型是void remove (const value_type& val);作用是删除list中值与val相同的节点,释放该节点的资源。

而list容器中的erase成员函数,原型是iterator erase (iterator position);作用是删除position位置的节点。

考虑到list::erase是与位置有关,故erase还存在API:   iterator erase (iterator first, iterator last);

对于set来说,只有erase API,没有remove API。 erase 的作用是把符合要求的元素都删掉。

(1) void erase (iterator position);
(2) size_type erase (const value_type& val);
(3) void erase (iterator first, iterator last);

综上所述,erase一般是要释放资源,真正删除元素的,

而remove主要用在vector中,用于将不符合要求的元素移到容器尾部,而并不删除不符合要求的元素

时间: 2024-08-07 00:17:28

STL:remove和erase区别的相关文章

慎用stl中的erase的返回值

在windows下的VC编译或者Mac OX的XCode下编译也许不会出问题.但是在linux下可能就会挂掉. 比如我上一篇里的poj4093出现了编译错误 2007120.8890/Main.cc: In function ‘int main()’: 2007120.8890/Main.cc:50:44: error: no match for ‘operator=’ in ‘itr1 = a.std::set<_Key, _Compare, _Alloc>::erase [with _Ke

[转] C++ STL中map.erase(it++)用法原理解析

总结一下map::erase的正确用法. 首先看一下在循环中使用vector::erase时我习惯的用法: for(vector<int>::iterator it = vecInt.begin(); it != vecInt.end();) { if(*it == 0) { it = vecInt.erase(it); } else { it++; } } 程序从一个vector中删除值为0的元素,利用了vector::erase函数根据iterator删除某个元素时会返回下一个元素的ite

STL --&gt; remove和remove_if()

remove和remove_if() Remove()函数 remove(beg,end,const T& value) //移除区间{beg,end)中每一个“与value相等”的元素: remove只是通过迭代器的指针向前移动来删除,将没有被删除的元素放在链表的前面,并返回一个指向新的超尾值的迭代器.由于remove()函数不是成员,因此不能调整链表的长度.remove()函数并不是真正的删除,要想真正删除元素则可以使用erase()或者resize()函数.用法如下: string str

正确使用stl map的erase方法

先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.erase有3个重载:void erase ( iterator position );size_type erase ( const key_type& x );void erase ( iterator first, iterator last ); . 所以下面的代码中的最后一个例子仅仅可以在win

STL vector list deque区别与实现(总结)

1 vector 向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即 capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉.通常此默认的内存分配能完成大部分情况下的存储. 优点: (1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组          

empty()与remove([expr])的区别.转

jquery之empty()与remove()区别 要用到移除指定元素的时候,发现empty()与remove([expr])都可以用来实现.可仔细观察效果的话就可以发现.empty()是只移除了 指定元素中的所有子节点,拿$("p").empty()来说,他只是把<p>dsfsd</p>中的文本给移除了,而留下 了<p></p>,仍保留其在dom中所占的位置.remove([expr])则是把其从dom中删除,而不会保留其所占的位置.例

C++中STL常用容器的区别(转)

我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚. verctor vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素.此外,当被插入的内存空间不够时,需要重新申请一块足够大的

[学习][STL]unique和erase

//在vector中的应用#include <iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; vector<int> a;vector<int>::iterator p; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++

C++ STL,list vector区别

顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组.在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值.当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作: 首