前面我们学会《如何为STL库中list添加元素?》,本节将为读者详细介绍如何删除list容器内的元素。当然,读者也可自行跳转《初识STL库中的list容器》查询list成员函数表,查找“删除”、“移除”等关键字查看具体函数,加深记忆。
如今学到这里,看到删除字样,我们第一反应就要是这个pop_front()、pop_back()头删尾删,还有erase()按位置迭代器删,clear()一键全清。不同于前面我们学习的序列式容器,list还有unique(),unique意思是“独一无二”,所以它的功能是删除重复的连续元素;相比deque的算法remove()+成员函数erase()去除所有指定元素,list直接给你remove()成员函数,更直接、更形象,实现容器内指定元素的全部清除,而且还有remove_if()来删除满足条件的元素。话不多说,上代码:
#include<bits/stdc++.h> #include<list> /* 如何为list容器删除元素 */ using namespace std; /*重点讲解:通过erase()为list删除元素*/ void test1() { /*erase()*/ list<int> l{1,2,3,4,5,7,8,9,10}; l.erase(++l.begin()) ;//erase(const_iterator pos) cout << "erase(++l.begin())在l容器内删除第2个元素后输出所有元素: "; for(auto it=l.begin();it!=l.end();++it) cout << *it<<" "; cout<<'\n' ; l.erase(++l.begin(),--l.end()) ;//erase(const_iterator first, const_iterator last) cout << "erase(++l.begin(),--l.end())在l容器内删除除首位元素以外的所有元素: "; for(auto it=l.begin();it!=l.end();++it) cout << *it<<" "; cout << '\n'; cout << '\n'; } /*练习头删尾删和clear()全清空*/ void test2() { list<int> l{1,2,3,4,5}; /*pop首尾元素*/ l.pop_front() ;//头删 cout << "pop_front()删除第一个元素后输出所有元素: "; for(auto it=l.begin();it!=l.end();++it) cout << *it<<" "; cout<<'\n' ; l.pop_back() ;//尾删 cout << "pop_back()删除最后一个元素后输出所有元素: "; for(auto it=l.begin();it!=l.end();++it) cout << *it<<" "; cout<<'\n' ; /*clear()一键清空*/ l.clear() ; cout << "clear()后l.size()为:"<< l.size()<<'\n'; cout<<'\n' ; } /*使用quique()去重*/ void test3() { list<int> l{1,2,2,3,4,4,5,6,6,7} ; cout<<"原容器为:" ; for(auto it=l.begin();it!=l.end();++it) cout << *it<<" "; cout<<'\n' ; l.unique(); cout << "通过unique()去除连续重复元素后:" ; for(auto it=l.begin();it!=l.end();++it) cout << *it<<" "; cout<<'\n' ; cout<<'\n'; } /*使用remove()、remove()_if去除指定元素*/ void test4() { /*remove(n) 去除lsit容器内所有n*/ list<int> l1{1,3,2,3,3,3,4,3,5,3} ; cout<<"原容器为:" ; for(auto it=l1.begin();it!=l1.end();++it) cout << *it<<" "; cout<<'\n'; l1.remove(3); cout << "通过remove()去除连续重复元素3后:" ; for(auto it=l1.begin();it!=l1.end();++it) cout << *it<<" "; cout<<'\n' ; /*remove_if() 去除lsit容器内*/ list<int> l2{1,2,3,4,5,6,7,8,9,10} ; cout<<"原容器为:" ; for(auto it=l2.begin();it!=l2.end();++it) cout << *it<<" "; cout<<'\n'; l2.remove_if([](int val){return val%2==0;}); cout << "通过remove_if()去除偶数元素后:" ; for(auto it=l2.begin();it!=l2.end();++it) cout << *it<<" "; cout<<'\n' ; } int main(){ test1(); test2(); test3(); test4() ; return 0; }
代码将每一个删除函数都使用了一遍,也是成功编译了:
读者是不是对这些删除函数感到既激动又惊讶呢,赶快打开编译器操练起来吧!
总结:本节主要讲解了如何对list容器进行删除元素的操作,list元素自己封装了一个remove函数直接删除指定元素,同时还能通过remove_if()删除符合条件的元素;list自己有一个去除连续重复元素unique(),这个在算法竞赛上有妙用,能够配合排序进行去重操作。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程