问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++ STL 中 remove 和 erase 的区别

发布网友 发布时间:2022-04-23 05:01

我来回答

2个回答

热心网友 时间:2023-10-14 12:25

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位置的节点。这也是与remove不同的地方。
考虑到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中,用于将不符合要求的元素移到容器尾部,而并不删除不符合要求的元素
原文链接:http://hi.baidu.com/tkzlpocleodtxzr/item/3a3a6037fdc8460cceb9fe86
vector中erase是真正删除了元素, 迭代器访问不到了。 algorithm中的remove只是简单的把要remove的元素移到了容器最后面,然后其余元素前移,迭代器还是可以访问到的。因为algorithm通过迭代器操作,不知道容器的内部结构,所以无法做到真正删除。
remove并不真正从容器中删除元素(容器大小并未改变),而是将每一个与value不相等的元素轮番赋值给first之后的空间,返回值FowardIterator 标示出重新整理后的最后元素的下一个位置。所以可以有以下操作:
vector<int> array;
array.erase(remove(array.begin(),array.end(),6),array.end());
删除数组中所有元素等于6的元素

原文链接:http://www.cnblogs.com/painful/archive/2011/08/16/2140704.html
C++的STL通过iterator将container和algorithm分离,并通过functor提供高可定制性。iterator可以看作是一种契约,algorithm对iterator进行操作,algorithm很难对container进行直接操作,这是因为algorithm对container所知甚少,一段代码,若未利用操作对象所知全部信息,将难以达到性能之极,并伴随其它种种折中现象。当然,这种“未知性”是必须的——algorithm对于真正的操作对象container不能做出太多假设,若假设过多,何来一个algorithm可以作用若干不同container的妙举,STL强大威力也将受损不少。
啰嗦几句,开个小头,转入正题。 先给出几个关于STL中erase和remove(remove_if等,下称remove类函数)的事实,小小复习:
erase一般作为一个container的成员函数,是真正删除的元素,是物理上的删除
作为算法部分的remove类函数,是逻辑上的删除,将被删除的元素移动到容器末尾,然后返回新的末尾,此时容器的size不变化
部分容器提供remove类成员函数,那么代表的是真正物理意义上的删除元素
如果该容器是vector、string或者deque,使用erase-remove idiom或者erase-remove_if idiom
如果该容器是list,使用list::remove或者list:remove_if成员函数
如果该容器是一个associative container,使用asso_con::erase成员函数或者remove_copy_if结合swap等方式
有一些比较特殊的容器具现,比如vector<bool>等,暂不考虑。

热心网友 时间:2023-10-14 12:25

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位置的节点。这也是与remove不同的地方。

考虑到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中,用于将不符合要求的元素移到容器尾部,而并不删除不符合要求的元素。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谁能给个单机版的风云之雄霸天下啊?? 求风云雄霸天下PC单机游戏WIN7版 雄霸天下任务指南 开心网001老房子卖了以后家具还有吗? 为什么001开心网买房子组件删除仓库里的东西都没了 请教一下,开心001的开心庄园里面的建材有好多富余的的 除了5元一个卖... 开心网001小号怎么给大号送房子? 开心网001多少级能送别人房子?多少级能接受别人给的房子? 开心网001果实或家具能送人吗 开心网(kaixin001)怎么买外地房子? string类中erase函数的实现怎样的 c语言字符串删除 编程自定义一个删除函数:erase(),要求对其进行重载,既能删除一维 erase()函数对器皿干了啥 我是个C++菜鸟。我想问一下,c++ string类中的erase()函数怎么用的 最好可以举例说明一下 有关于C++中string的erase函数的问题 C++中的erase操作 C++:erase删除容器中元素 C++ STL中erase函数的用法 求助~~ C++erase的问题 C++erase函数的使用 C++中string中的erase函数怎么使用 JAVA语言的特点? 为什么我的电脑连接上了打印机,打印机却不能打印 什么是承兑汇票贴现? 激光打印机和喷墨打印机的区别是什么? JAVA中的从键盘输入数据的语句格式是什么? 海尔中央空调显示E5是什么故障? 打印机打印时突然跳到另一个打印机打印是怎么回事? 银行承兑汇票贴现都需要哪些资料? C++关于vector的erase函数的问题 C++中A是字符串,A.erase(0,1)是什么意思? C++ STL vector erase函数中,有没有重新分配内存? c++如何删除一个数组中的重复元素 c++ 里面的erase()和insert()的问题。 C++高手啊,过来帮帮忙吧,vector里面的函数erase怎么用的?你们看我的这个为什么就有错误呢?? 椰子肉怎么吃呢? 椰子肉的正确吃法是什么? 三年级给校长的一封信怎么写 给校长的一封信500字表达自己对学校感谢之情和美好祝愿! 给校长的一封信(建议书) 要有格式,500字以上!! 这是作业紧急!!!_百度... 作文给校长的一封信 椰子肉怎么吃? 给校长的一封信400字作文 椰肉可以怎么吃? 给校长的一封信(意见书)300字左右 椰肉怎么吃吗? 一位即将毕业的小学生给中学校长的一封信 致校长的一封信作文怎么写? 一位即将毕业的小学生给中学校长的一封信 作文 急!!!