一、list基础介绍
list,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。所以list容器中在地址空间内的存储不是连续的一段空间,而是根据指针位置分散存储的。由于其底层是双向链表,故其一个结点具有前驱指针和后继指针,方便进行插入和删除操作。
使用list容器需要添加以下头文件:
#include <list>
二、创建并初始化list容器`
#include <iostream>
#include <list>
#include<algorithm>
using namespace std;
int main(){
//list创建操作与vector和deque基本相同
list<int> list0;
list<int>::iterator it;
for(int i=0;i<10;i++){
list0.push_back(i);
}
//由于list是双向链表,所以其迭代器it不支持<、>等操作
//因此在遍历的时候选用!=
for(it=list0.begin();it!=list0.end();it++){
cout<<*it<<" ";
}
}
三、访问list元素
由于list是双向链表,不支持随机存储方式,所以不能够使用下标进行数据访问。
要访问list元素,只能通过front()和back()进行操作,以及使用迭代器进行遍历。
#include <iostream>
#include <list>
#include<algorithm>
using namespace std;
int main(){
//list创建操作与vector和deque基本相同
list<int> list0;
list<int>::iterator it;
for(int i=0;i<10;i++){
list0.push_back(i);
}
//由于list是双向链表,所以其迭代器it不支持<、>等操作
//因此在遍历的时候选用!=
for(it=list0.begin();it!=list0.end();it++){
cout<<*it<<" ";
}
cout<<endl;
//使用front()和back()进行数据访问
cout<<list0.front()<<endl;
cout<<list0.back()<<endl;
}
四、插入删除操作
list容器的插入删除操作基本与deque一致,因为二者都支持双端读取,故可以使用push_back()和push_front()进行插入,pop_front()和pop_back()同理。
#include <iostream>
#include <list>
#include<algorithm>
using namespace std;
int main(){
//list创建操作与vector和deque基本相同
list<int> list0;
list<int>::iterator it;
for(int i=0;i<10;i++){
list0.push_back(i);
}
//由于list是双向链表,所以其迭代器it不支持<、>等操作
//因此在遍历的时候选用!=
for(it=list0.begin();it!=list0.end();it++){
cout<<*it<<" ";
}
cout<<endl;
//前端插入
list0.push_front(99);
//尾部插入
list0.push_back(100);
//前端弹出
list0.pop_front();
//尾部弹出
list0.pop_back();
//清空元素
// list0.clear();
//erase()利用迭代器删除元素
auto j = list0.begin();
++j;
list0.erase(j);
//erase()删除特定区域的值
auto first = list0.begin();
first++;
auto bakc = list0.end();
bakc--;
list0.erase(first,bakc);
//remove()利用值删除元素
list0.remove(2);
//还可以使用unique删除list中的相邻的相同元素
list0.unique();
for(it=list0.begin();it!=list0.end();it++){
cout<<*it<<" ";
}
}