第3篇 序列式容器(sequence container)

本文深入解析STL中的序列式容器,包括vector的实现技术、list的迭代器、deque的内存管理、stack和queue的工作原理、heap的隐式表述以及priority_queue和slist的特点。重点讨论了容器的内部数据结构和操作,如vector的容量扩张、list的迁移操作、deque的缓冲区管理等。
摘要由CSDN通过智能技术生成

常用的数据结构:array\list\tree\stack\queue\hash table\set\map…

1 vector

1.1 vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。因为“配置新空间/数据移动/释放旧空间”是一个大工程。

1.2 vector的迭代器提供的是Random Access Iterators。

`typedef value_type* iterator;      //vector的迭代器是普通的指针`

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

注意①:增加新元素(s)时,如果超过当时的容量,则容量会扩充至两倍。如果两倍容量仍不足,就扩充至足够大的容量。

②:容量的扩张必须经历“重新配置、元素移动、释放原空间”等过程。

2 list

2.1 list的节点(node)

//是个双向链表
template <class T>
struct __list_node {
    typedef void* void_pointer;
    void_pointer prev;      //型别为void*,其实可以设为__list_node<T>*
    void_pointer next;
    T data;
}

2.2 list的迭代器是Bidirectional iterator。由于STL list是一个双向链表,还是一个环状双向链表,迭代器必须具备前移、后移的能力,并有能力进行正确的递增、递减、取值、成员存取等操作。

list的一个重要性质:插入操作和接合操作都不会造成原有的list迭代器失效,甚至list的元素删除操作,只有“指向被删除元素”的那个迭代器失效,其他的迭代器不受影响。

2.3 list内部提供一个所谓的迁移操作(transfer):将某连续范围内的元素迁移到某个特定位置之前。

//将[first,last)内的所有元素移动到position之前
void transfer(iterator __position, iterator __first, iterator __last) {
    if (__position != __last) {
      // Remove [first, last) from its old position.
      __last._M_node->_M_prev->_M_next     = __position._M_node;
      __first._M_node->_M_prev->_M_next    = __last._M_node;
      __position._M_node->_M_prev->_M_next = __first._M_node; 

      // Splice [first, last) into its new position.
      _List_node_base* __tmp      = __position._M_node->_M_prev;
      __position._M_node->_M_prev = __last._M_node->_M_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值