STL之List

vector :vector和built-in数组类似,拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的。vector的用法解析可以参考本人的另一篇随笔: http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/08/2627666.html
list:list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
deque:deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。
 
因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,具体可以遵循下面的原则:
1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
list链式存储.(双向链表)
头文件
#include<list>
声明一个 int型list: list<int> listi
1、list的构造函数
list<int>a{1,2,3}  
list<int>a(n)    //声明一个n个元素的列表,每个元素都是0  
list<int>a(n, m)  //声明一个n个元素的列表,每个元素都是m  
list<int>a(first, last)  //声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素,first和last是迭代器
2、begin和end
通过调用 list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的end()函数来得到list末端下一位置。
3、push_back和push_front
使用 list的成员函数push_back和push_front插入一个元素到list中。其中push_back()是从list的末端插入,而push_front()是从list的头部插入。
4、empty
判断 list是否为空
5、resize
调用 resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除。如果n比list原来的长度长,那么默认超出的部分元素置为0.也可以用resize(n,m)的方式将超出部分赋值为m。
6、Clear
清空 list中所有的元素。
7、front和back
通过 front可以获得list容器中的头部元素,通过back可以获得list容器的最后一个元素。注意当list元素为空时,调用front和back不会报错。因此在编写程序时最好先调用empty函数判断list是否为空。
8、pop_back和pop_front
使用 pop_back()可以删掉尾部第一个元素,pop_front()可以删掉头部第一个元素。注意:list必须不为空,如果当list为空的时候调用 pop_back()和pop_front()会使程序崩掉。
9、assign
有两种使用情况:
1)a.assign(n, val):将a中的所有元素替换成n个val元素
例如:
list<int>b{1,2,3,4,5};  
b.assign(5,10);  
b中的元素变为10, 10, 10, 10, 10
 
2)a.assign(b.begin(), b.end())
list<int>a{6,7,8,9};  
list<int>b{1,2,3,4,5};  
b.assign(a.begin(),a.end());  
b中的元素变为6,7,8,9
10、swap
交换两个链表。 a.swap(b)和swap(a,b)都可以完成a链表和b链表的交换。
11、Reverse
可以实现 list的逆置
12、merge()
a.merge(b) 调用结束后b变为空,a中元素包含原来a和b的元素。
例子:
list<int>a{6,7,8,9};  
list<int>b{2, 1, 3, 6, 5};  
a.merge(b,greater<int>());  
a中元素变为:6,7,8,9,2,1,3,6,5
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxz520zmg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值