《STL源码解析》读书笔记之序列式容器(1)

1.vector

     vector的数据安排以及操作方式与array非常相似,两者的唯一差别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能再改变。vector是动态空间,随着元素的加入它的内部机制会自行扩充空间以容纳新元素。

(1)vector的迭代器

     因为vector维护的是一个连续线性空间,所以无论其元素型别为何,普通指针都可以作为vector的迭代器。因为vector迭代器所执行的操作行为,如operator*,operator->,operator++,operator--,operator+,operator-,operator+=,operator-=,普通指针天生就具备。可见,vector提供的是Random Access Iterator。

     vector的迭代器定义如下:


(2)vector的数据结构

     vector所采用的数据结构非常简单:线性空间。它采用两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间的尾端


     为了降低空间配置时的速度成本,vector实际配置的大小可能比目前vector存储的数据所需的空间要大,以备将来的扩充。也就是说,一个vector的容量永远大于或等于其大小。vector的空间使用情况如下:


     注意,所谓动态增长,并不是在原来空间之后接续新空间,而是以原大小的两倍配置一块较大空间,然后将原内容拷贝过来。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。

(3)vector的元素操作

a.push_back():若还有剩余空间,直接使用剩余空间。若没有剩余空间了,则开辟一块新的更大的空间,将vector存储的所有内容复执过来,再将新元素插入。

b.pop_back():将尾端元素销毁掉,再调制尾端的位置。

c.erase(first,last):将last到finish的元素复制到first起始的内存地址处,如下图:

d.insert(position,n,x):分三种情况来操作:(1)备用空间大于等于新增元素个数,插入点之后的元素个数大于新增元素个数。(2)备用空间大于等于新增元素个数插入点之后的元素个数小于等于新增元素个数。(3)备用空间小于新增元素个数。三种情况对应的操作如下:




2.list

     相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或者删除一个元素,就申请或释放一个元素空间。因此,list对于空间的运用绝对的精确,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。

(1)list的节点

     STL list的节点结构如下,它是一个双向节点结构:

(2)list的迭代器

     list不再像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在。list迭代器必须有能力指向list的节点,并能进行正确的递增、递减取值成员存取等操作,如下图所示:


     迭代器的设计如下所示:

(3)list的数据结构

     list不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针,便可以完整表现整个链表:

      一个list的示意图如下:


(4)list的操作

     对STL list的操作就是对一个双向循环链表的操作。下面以transfer为例说明:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值