stl部分容器学习及实现

//没有去写独立的空间配置器,只是写了一个简单的simple_alloc用来配合各个容器对内存管理的需求。
一 序列式容器。
1.vector.
a.概念:拥有动态空间的数组
b.特点:和array唯一的区别就是vector随着元素的加入可以自动的扩展空间。
代码:http://blog.csdn.net/mosqquito_gao/article/details/50766945
c.总结:在代码实现中利用三个指针start,finish,end来记录元素和空间大小,当元素充满整个空间时就建立一个大小为原来两位的新vector并将原vector上的元素拷贝过来。
2.list.
a.概念:用链表结构去完成的数组。
b.特点:插入和删除比vector方便,但是不能在o(1)的时间上去完成元素的查找。
代码:http://blog.csdn.net/mosqquito_gao/article/details/50775260
c.总结:list类的实现其实就是链表的实现没有什么难度,list的实现中迭代器并不像vector那样用原生指针就可以,而是自己去实现一个list_iterator。用迭代器去完成对链表的操作。stl_list是的实现是使用了双向循环链表,所以只要一个指向尾节点的指针就可以记录整个链表,而prev和next指针让插入,删除等操作也更加简单。
3.deque.
a.概念:双向开口的连续线性空间。
b.特点:虽然和vector一样都是连续的线性空间但在实现上则不同。deque可以常数时间内对头端进行插入和删除操作。
代码:http://blog.csdn.net/mosqquito_gao/article/details/50790785
c.总结:deque不是简单的开辟一个连续的空间,而是先开辟一个名为map的连续空间,里面存储着一组指针,而这些指针每一个都指向一个连续空间。而deque的元素就真正的存储在这些空间上。map负责去记住这些空间。map就是一个T**。map中的指针并不是从头开始存储而是都存储在map的中间位置,这也就保证了deque的双向性。
为了保证对deque的操作,所以deque也需要自己的迭代器,它的迭代器通过cur , first , last 和 node 。来记录元素。cur,first,last 来记录map中指针所指向的真正的存储空间。node又来指向map中现在所操作空间的指针.如图:
上面的为map空间,下面的为真正的存储空间

4.stack
a.概念:栈空间先进后出的线性空间。
b.特点:同为线性空间它的特点是先进后出,拒绝随机查取元素。只能访问栈顶元素。
代码:http://blog.csdn.net/mosqquito_gao/article/details/50848931
c.总结。stack的实现是基于deque的,deque是双开口的线性空间,只要通过封装不去提供随机访问和头端的接口,就可以达到栈先进后出的特性,而具体的操作都已经被deque实现只要直接调用即可。
5.queue.
a.概念:先进先出的线性空间
b.特点:先进先出导致他只有在最低端加入新元素,最顶端取出新元素。
代码:http://blog.csdn.net/mosqquito_gao/article/details/49852417 数据结构的实现。没有用到deque .
http://blog.csdn.net/mosqquito_gao/article/details/50848931 基于deque的queue容器实现。
c.总结:同stack一样只要通过封装去可以完成queue的特性。
二 关联式容器
1.rb_tree
a.概念:红黑树是二查搜索树的一个变种。最坏的操作时间为O(logN)
b.特点:(1).每一个节点都是红色或黑色的。
(2).根是黑色的
(3).如果一个节点是红色的那么它的子节点必须是黑色的
(4).从一个节点到NLL指针的路径必须包含相同数目的黑色节点
红黑树通过以上四个性质来保证自身的平衡性,着色使得红黑树的高度最多为2log(N+1)。因此使得查找操作是一种对数的。实现难点在于插入和删除,可以通过旋转操作和自上到下的重新着色来完成。
代码:http://blog.csdn.net/mosqquito_gao/article/details/50848816
c.总结:红黑书是STL中没有提供给用户的关联容器。在实现中为了更加灵活的操作使用了节点和迭代器都是为双层的结构。 rb_tree_node_base和rb_tree_node构成了rb_tree的节点。双层的迭代器也分别指向双层的节点结构。iterator_base用来实现++ 和 – 操作符。iterator则负责记录节点。
2.set
a.概念
b.特点:元素会根据元素的键值自动排序。set元素的键值就是它的实际值。不允许有相同的键值。
代码:http://blog.csdn.net/mosqquito_gao/article/details/50865375
c.总结。set是建立在rb_tree的基础上的。二叉搜索树的性质保证了set中的元素排序。rb_tree则保证了set中元素查取得速度效率。
3.map

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值