目录
list容器
0.list(双向链表)容器介绍
头文件
#include <list>
容器特性
- list 是一个双向链表,可以高效的插入删除元素
- list 不可以随机存取元素,所以不支持 list.at(target) 和 list[target] 操作符
单次移动
list<int>::iterator it;
for(it = list.begin();it!=list.end();it++)
cout<<*it;
it+5; //error,不支持+运算符的重载
1.list容器的构造
默认构造
list<int> l_int;
list<float> l_float;
list<string> l_string;
带参构造
list<int> l_a;
list<int> l_b(5,8); //8 8 8 8 8
list<int> l_c(a.begin(),a.end()); //将前l_a拷贝给l_c,左闭右开
list<int> l_d(l_b); //触发拷贝构造函数的调用,将l_b拷贝给l_d
2.list赋值
list.assign(l.begin(),l.end()); //将其他list中[begin,end)区间内的元素拷贝到自身
list.assign(n,elem); //将n个elem拷贝赋值給自身(覆盖)
list& operator = (const list &list); //重载等号操作符
list.swap(otherlist); //将其他list元素和本身元素交换
3.list头部尾部添加移除操作
list.push_back( elem); //尾部插入一个元素
list.pop_back(); //尾部移除最后一个元素
list.push_front(elem); //头部插入一个元素
list.pop_front(); //头部移除第一个元素
4.list的迭代器
list 的迭代器是双向迭代器 ,可以从两个方向来读写容器。
list<int>::iteratir it;
list.begin(); //返回容器中第一个元素的迭代器
list.end(); //返回容器中最后一个元素的下一个元素的迭代器
list<int>::reverse_iterator rit;
list.rbegin(); //返回容器中倒数第一个元素的迭代器
list.rend(); //返回容器中倒数最后一个元素的下一个元素的迭代器
5.list大小
list.size(); //返回容器中元素的个数(容器长度)
list.empty(); //返回一个bool值判断容器是否为空,空返回true,非空返回false
list.resize(num); //重新指定容器长度,如果变长,则超出部分以默认值填充;如果变短,则末尾删除超出部分
list.resize(num,elem); //超出部分以指定元素elem来填充
6.list容器的插入
list 是不连续容器,插入操作不会导致迭代器失效
//insert的三种重载
list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
list.insert(pos,n,elelm); //在pos位置处插入n个elem数据,无返回值
list.insert(pos,otherlist.begin(),otherlist.end()); //在pos位置上插入其他list[beg,end)区间内元素
7.list容器的删除
list.clear(); //移除容器所有的数据
list.erase(beg,end); //删除[beg,end)区间内的所有元素,返回下个元素的位置
list.erase(pos); //返回pos位置上的数据,并返回下一个元素的位置
list.remove(elem); //删除容器所有和elem匹配的元素
8.反转链表
list.reverse(); //翻转链表顺序
9.list迭代器的失效
删除节点会导致迭代器失效
for(list<int>::iterator it=l.begin();it!=l.end();it++){
if(*it==3){
l.erase(it); //迭代器通过节点next指针寻找下一个节点,该节点被释放,该节点的next指针所指向的地址也就丢失,相当于迭代器失效。
}
}
// interator
// ||
//Node1(next)-><-(pre)Node2(next)-><-(pre)Node3