C++中remove与erase区别小结
作者:吃我一个平底锅
remove函数和 erase函数都可以实现元素的删除,本文主要介绍了C++中remove与erase区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
vector中, remove函数和 erase函数都可以实现元素的删除,但它们的用法稍微有些区别:
- erase是删除指定位置的元素或者指定区域内的所有元素
- remove是删除和指定元素值相同的所有元素(remove需要和erase搭配使用才能实现完整的删除功能)
erase
erase用于从一个集合中删除一个元素,但是对于基于数组的容器,如vector,存储在被删除元素后的所有元素都需要向前移动以避免集合中有一个空位(gap),在同一容器中多次调用产生了大量移动元素的开销。并且使用erase之后,后面元素的迭代器都会失效,例如:
#include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; int main() { vector<int> vec = { 1,2,3,4,5,6,7 }; vector<int>::iterator itr = vec.begin(); for(auto itr=vec.begin();itr!=vec.end();++itr) { if (*itr %2 == 1) { vec.erase(itr); } } for(auto it=vec.begin();it!=vec.end();++it){ cout<<*it<<" "; } return 0; }
这样的代码时无法编译成功的,因为在erase以后,之后所有的迭代器都失效了,此时会返回一个新的迭代器,我们可以对代码进行如下修改:
#include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; int main() { vector<int> vec = { 1,2,3,4,5,6,7 }; vector<int>::iterator itr = vec.begin(); while (itr != vec.end()) { if (*itr %2 == 1) { itr=vec.erase(itr); }else{ ++itr; } } for(auto it=vec.begin();it!=vec.end();++it){ cout<<*it<<" "; } return 0; }
满足条件的就利用返回的新的迭代器,不满足条件的直接++;
remove
他们存在于algorithm库,由于这些算法运行在两个前向迭代器确定的元素范围上,它们没有底层容器或集合的具体知识。并不从容器删除元素,而是把不符合删除标准的元素搬移到容器的尾部,并保持这些元素的相对次序,返回指向最后一个元素下一个位置的迭代器。 该算法一次通过数据范围即可实现该目标。由于没有元素被删除,因此不会改变容器的大小和容量。容器尾部的元素都是需要被删除的,一般remove需要和erase搭配使用才能实现完整的删除功能。
#include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int> vec{ 1,3,3,4,3,5 }; auto iter = std::remove(vec.begin(), vec.end(), 3); cout << "size is :" << vec.size() << endl; cout << "capacity is :" << vec.capacity() << endl; //输出迭代器之前的元素 for (auto first = vec.begin(); first < iter;++first) { cout << *first << " "; } cout<<endl; //输出vec剩余的元素 for (auto it = vec.begin(); it != vec.end();++it) { cout << *it << " "; } return 0; }
- remove() 的实现原理是,在遍历容器中的元素时,一旦遇到目标元素,就做上标记,然后继续遍历,直到找到一个非目标元素,即用此元素将最先做标记的位置覆盖掉,同时将此非目标元素所在的位置也做上标记,等待找到新的非目标元素将其覆盖。因此,如果将上面程序中 demo 容器的元素全部输出,得到的结果为 1 4 5 4 3 5。
- 通过remove()并没有把这些值真正的删除,需要配合erase来完成删除操作:
#include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int> vec{ 1,3,3,4,3,5 }; auto iter = std::remove(vec.begin(), vec.end(), 3); cout << "原 size is :" << vec.size() << endl; cout << "原 capacity is :" << vec.capacity() << endl; vec.erase(iter,vec.end()); cout << "删除后 size is :" << vec.size() << endl; cout << "删除后 capacity is :" << vec.capacity() << endl; //输出迭代器之前的元素 for (auto first = vec.begin(); first < iter;++first) { cout << *first << " "; } cout<<endl; //输出vec剩余的元素 for (auto it = vec.begin(); it != vec.end();++it) { cout << *it << " "; } return 0; }
也可以合并进行删除:
#include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int> vec{ 1,3,3,4,3,5 }; vec.erase(remove(vec.begin(),vec.end(),3),vec.end()); cout << "删除后 size is :" << vec.size() << endl; cout << "删除后 capacity is :" << vec.capacity() << endl; //输出vec剩余的元素 for (auto it = vec.begin(); it != vec.end();++it) { cout << *it << " "; } return 0; }
补充删除 vector 容器元素的几种方式
到此这篇关于C++中remove与erase区别小结的文章就介绍到这了,更多相关C++ remove erase 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!