C++primer:list,deque和vector

1、vector容器的元素以连续的方式存储,所以当执行insert操作时,如果内存不够了,vector必须重新分配存储空间才能插入新的元素,此时的过程是:
首先将存储在旧的存储空间的元素复制到新的存储空间,然后插入新元素,最后撤销旧的存储空间。

2、list容器的元素以链表的方式不连续存储,插入一个新元素时,只需要:
创建一个新的元素,然后将该元素连接在已存在的链表中,不存在重新分配内存的事。

3、然而在大部分的实际应用中,使用vector容器是最好的,因为标准库的实现者使用了这样的内存分配策略:以最小的代价连续存储元素。
vector容器每次因为内存空间不够了而重新分配内存空间时,实际分配的容量比当前需要的多一些,而不是存多少就分配多少,其分配的额外内存容量的确切数目随着库的实现不同而不同。

4、三者的选择:
(1)、vector和deque支持对元素快速的随机访问,但在容器任意位置插入或删除,将比在容器尾部插入和删除的开销大;
list可以在容器任意位置快速的插入或删除,但不支持快速随机访问,即不能用下标[]或at()访问元素,访问某个元素只能通过遍历的方法。

(2)、插入和删除操作,访问操作:
1)、list容器:链表结构允许向前或向后逐个遍历元素,插入或删除一个元素不需要移动其他元素,但是随即访问某个元素时,必须遍历相关元素,如:要依次访问list中第5,10个元素时,必须跟随指针,必须遍历第5个元素和第10个元素间所有元素才能找到第10 个元素;
2)、vector容器:除了在容器尾部插入或删除数据,其他任意位置的插入或删除元素都将导致钙元素右边元素的移动。
3)、deque容器:兼具了list和vector容器的性质:
支持快速的随机访问;
在首部和尾部都支持快速的插入或删除元素;
在容器中间插入或删除元素时效率低;

5、vector中的reserve和resize:
(1)、vector可以用reserve手动分配内存大小,但只是预留存储空间,不创建元素对象,如

vector<int> ivec;
ivec.reserve(1024);

此时,ivec依然只是一个空向量,没有元素。

而resize改变容器大小,且创建元素对象,如

ivec.resize(512);

创建了512个默元素对象,并调用了元素的默认构造函数。

(2)、resize可以有两个形参,第一个参数是改变后的容器大小,第二个参数是新加入元素的值,第二个参数省略时,调用元素的默认构造函数。

(3)、当resize后的容器大小没有超出预留的内存空间,内存空间不会重新分配,若超出了,内存空间会自动重新分配。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值