1.基本概念
功能: 将数据进行链式存储
链表
(
list
)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列
结点
组成
结点的组成:一个是存储数据元素的
数据域
,另一个是存储下一个结点地址的
指针域
STL
中的链表是一个双向循环链表
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
list
的优点:
采用动态存储分配,不会造成内存浪费和溢出链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list
的缺点:
链表灵活,但是空间 ( 指针域 ) 和 时间(遍历)额外耗费较大List 有一个重要的性质,插入操作和删除操作都不会造成原有 list 迭代器的失效,这在 vector 是不成立的
2. 构造函数
list<T> lst; //list
采用采用模板类实现
,
对象的默认构造形式。
list < int > L1 ;
list(beg,end)
; //构造函数将
[beg, end)
区间中的元素拷贝给本身。
list < int > L2 ( L1 . begin (), L1 . end ());
list(n,elem)
; //构造函数将
n
个
elem
拷贝给本身。
list < int > L3( 10 , 1000 );
list(const list &lst)
; //拷贝构造函数。
list < int > L4 ( L3 );
3.赋值和交换
assign(beg, end)
; //将
[beg, end)
区间中的数据拷贝赋值给本身。
L2 . assign ( L1 . begin (), L1 . end ());
assign(n, elem)
; //将
n
个
elem
拷贝赋值给本身。
L3 . assign ( 10 , 100 );
list& operator=(const list &lst)
; //重载等号操作符
L4 = L3 ;
swap(lst)
; //将
lst
与本身的元素互换。
L1 . swap ( L2 );
4.大小操作
size(); //
返回容器中元素的个数
cout << "L1 的大小为: " << L1 . size () << endl ;
empty(); //
判断容器是否为空
int a=L1 . empty () //1为空,0为非空
resize(num); //
重新指定容器的长度为
num
,若容器变长,则以默认值填充新位置。
//
如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem); //
重新指定容器的长度为
num
,若容器变长,则以
elem
值填充新位置。
//
如果容器变短,则末尾超出容器长度的元素被删除
L1 . resize ( 10 );
5.插入和删除
push_back(elem); //在容器尾部加入一个元素
L . push_back ( 10 );
pop_back(); //删除容器中最后一个元素
L . pop_back ();
push_front(elem); //在容器开头插入一个元素
L . push_front ( 100 );
pop_front(); //从容器开头移除第一个元素
L . pop_front ();
insert(pos,elem); //在
pos
位置插
elem
元素的拷贝,返回新数据的位置。
insert(pos,n,elem); //在
pos
位置插入
n
个
elem
数据,无返回值。
insert(pos,beg,end); //在
pos
位置插入
[beg,end)
区间的数据,无返回值。
clear(); //移除容器的所有数据
erase(beg,end); //删除
[beg,end)
区间的数据,返回下一个数据的位置。
erase(pos); //删除
pos
位置的数据,返回下一个数据的位置。
remove(elem); //删除容器中所有与
elem
值匹配的元素。
6.数据存取
front()
; //返回第一个元素。
cout << " 第一个元素为: " << L1 . front () << endl ;
back()
; //返回最后一个元素。
cout << " 最后一个元素为: " << L1 . back () << endl ;
list容器的迭代器是双向迭代器,不支持随机访问
list<int>::iterator it = L1.begin();
it = it + 1;//错误,不可以跳跃访问,即使是+1
it++;//正确
7. 反转和排序
reverse(); //
反转链表
L . reverse ();
sort()
; //链表排序,默认从小到大
L . sort ();
注意:不可以使用sort (L.begin(),L.end())排序。因为List不支持随机访问迭代器。