STL-顺序容器-列表list

 list和双向链表结构相似,每个节点包含一个数据块,前向指针,和后向指针,存储在非连续的内存空间

很显然,查找操作时,只能顺序查找,不支持内部随机访问;不像数组,向量vectoer,队列可以用下标查找

但是可以在任意序列位置插入和删除,这是vector和queue(deque)无法比拟的

而且相比较于vector占用空间更多

list和循环链表也有相似的地方,即:头节点的前驱元素指针域保存的是链表中尾元素的首地址list的尾节点的后继元素指针域则保存了头节点的首地址,这样,list实际上就构成了一个双向循环链。

对于迭代器,只能通过“++”或“--”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作,与vector等不同。

常用操作:

1.list中的构造函数:
list() 声明一个空列表;
list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的
list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的
list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素


2.
list.push_back() 
list.push_front():
分别从list的末端插入,头部插入元素。


3.

list.empty():判断list是否为空,空则返回true。


4.
list.resize(): 
序列长度调整,原序列超出元素删除;
如果扩展,调用默认构造函数T()将元素加到list末端。
如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造;


5.

list. clear(): 清空list中的所有元素。


6. 

list.front()和list.back(): 分别获取list首,尾元素
list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,最好先调用empty()函数判断list是否为空。


7. 

list.pop_back和list.pop_front():分别删除最后一个,第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。


8. 

assign():具体和vector中的操作类似,

list.assign(n,val) 将 list中元素变为n个T(val)。

list.assign(list2.begin(),list2.end()) 将list2中的从list2.begin()到list2.end()之间的数值赋值给list。


9. 

swap():交换两个链表(两个重载), 
list1.swap(list2); 
swap(list1,list2),
都可以完成两个列表的交换


10.

 list.reverse():完成list的反向。


11. 

merge():合并两个链表并使之默认升序(可修改),
list.merge(list2,greater<int>()); 
调用结束后list2变为空,list1中元素包含原来两个序列中的元素,并且升序。
默认是升序,greater<int>()可以省略。


12.

insert某位置插入值

list.inset(位置,值);

list和循环链表也有相似的地方,即:头节点的前驱元素指针域保存的是链表中尾元素的首地址,list的尾节点的后继元素指针域则保存了头节点的首地址,这样,list实际上就构成了一个双向循环链。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值