从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)

deque

deque双端队列,分段连续空间数据结构,由中控的map(与其说map,不如说是数组)控制,map中每个槽指向一个固定大小的缓冲(连续的线性空间)。 
deque的迭代器,关键的四个指针:

cur     //所指缓冲区中的现元素
first //所指缓冲区中的头
last //所指缓冲区中的尾
node //指向中控的槽

start指向中控第一个槽位的buffer中的第一个元素,finish指向中控最后一个槽位指向的buffer中的最后一个元素。 
每次新建deque时,创建中控map和nodes,根据初始的元素个数计算开始槽位nstart和nfinish。

map_pointer nstart = map + (map_size - num_nodes) / ;
map_pointer nfinish = nstart + num_nodes - ;

这样做的原因是双端push或pop时的平均性能最佳。

如图,如果需要push_back,刚好finish指向的buffer将满,会向map中finish后一个槽位新建一个buffer node;对应的push_front会向map中start前一个槽位新建一个buffer node;如果map不够空间,也还是要reallocate_map,重新分配map空间迁移已有数据,释放老数据。

std::stack,std::queue

  • stack是FILO的数据结构,只有一个出口,若以上述的deque实现,封住deque的头端开口,轻易就能实现stack,stack往往不被归为container,而被归为container adapter,源码十分简短,底层容器就是deque(当然也可以使用list:如stack<int, list >)
class Sequence = deque<T>
  • queue是FIFO的数据结构,封住back的出口和front的入口即可轻易实现,代码同stack,也被认为是container adapter。

NSArray(CF-1151.16源码中的CFArray)

iOS中为什么没有实现stack,queue这样的适配器?应该是CFArray底层也是类似双端队列这样的数据结构,可以轻易实现FILO或FIFO功能,就没必要再多此一举了。 
刚好在 CFArray.c 源码中定义了__CFArrayDeque,和各种deque相关操作的方法。

struct __CFArrayDeque {
uintptr_t _leftIdx;
uintptr_t _capacity;
/* struct __CFArrayBucket buckets follow here */
};

但是苹果的NSArray真实实现谁也不知道,也可能是 环形队列,这样貌似性能更高,请看这篇文章; 
其他容器的实现。

小结

关于iOS为什么不实现std::stack和std::queue,可能苹果觉得NSMutableArray完全可以通过deque的性质轻易的实现FILO或FIFO特性,再实现就是多此一举了吧。 
ps:CF源码我还没看完,继续啃吧。

从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)的更多相关文章

  1. 容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

    一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/d ...

  2. C++ STL基本容器的使用(vector、list、deque、map、stack、queue)

    1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...

  3. [STL]deque和stack、queue

    怎么说呢,deque是一种双向开口的连续线性空间,至少逻辑上看上去是这样.然而事实上却没有那么简单,准确来说deque其实是一种分段连续空间,因此其实现以及各种操作比vector复杂的多. 一.deq ...

  4. C++ std::stack

    std::stack template <class T, class Container = deque<T> > class stack; LIFO stack Stack ...

  5. C++ std::stack 基本用法

    #include <iostream> #include <string> #include <stack> // https://zh.cppreference. ...

  6. why std::stack has separate top() and pop()

    SGI explanation: http://www.sgi.com/tech/stl/stack.html One might wonder why pop() returns void, ins ...

  7. 剑指offer——stack与queue的互相实现

    我们知道,stack和queue是C++中常见的container.下面,我们来探究下如何以stack来实现queue,以及如何用queue来实现stack. 首先,先了解下stack与queue的基 ...

  8. C++ STL:stack和queue

    http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/ ...

  9. c++ List、Vector、Stack、Queue使用

    一.List使用 引入头文件#include <list> List基本函数Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比 ...

随机推荐

  1. Docker 架构详解 - 每天5分钟玩转容器技术(7)

    Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

  2. Javascript一道面试题

    实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 function add () ...

  3. 比较Java中几个常用集合添加元素的效率

    初始化需要进行比较的集合,统一增加10万个元素,获取整个过程的执行时间. 1.List集合增加元素 private static void testList() { List<Integer&g ...

  4. httpd: Could not reliably determine the server's fully qualified domain name

    作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 问题描述: AH00558: httpd: Could not reliab ...

  5. 关于“foreach循环”中遇到的几个问题总结

    1.列表页面用"foreach循环"的时候数据没有显示,此时需要检查你对象模型中属性的首字母是否大写,切记不能大写(本人在做一个项目的时候,对象模型是别人建立的,属性首字母大写了, ...

  6. STM 8s 外部中断寄存器无法写入

    虽然说单片机开发就是对手册的研究,但是开发过程中,还是要做些笔记的,方便以后注意那些坑. 工作要求所以接触了一下STM328s00f3这个芯片,配置外部中断的时候遇到了一点问题 PS:IAR这个开发软 ...

  7. centos永久修改主机名

    永久修改主机名 以上的修改只是临时修改,重启后就恢复原样了. 步骤1: 修改/etc/sysconfig/network中的hostname vi /etc/sysconfig/network HOS ...

  8. js实用方法记录-js动态加载css、js脚本文件

    js实用方法记录-动态加载css/js 附送一个加载iframe,h5打开app代码 1. 动态加载js文件到head标签并执行回调 方法调用:dynamicLoadJs('http://www.yi ...

  9. mac Ubuntu 设置快捷进入目录

    在我们实际工作中,好多时间需要经常性的进入某个目录查看文件等等之类的操作. 好多时候我们都是在终端一级一级的进入目录,相比较Windows的快捷方式有点繁琐. 废话少说,下面就是设置快捷方式的方法: ...

  10. Node.js入门以及第一个helloworld程序

    1.概念:简单的说 Node.js 就是运行在服务端的 JavaScript.学之前需要明白Node.js是无法挑战jsp.php或者asp这种老牌网站的地位的,是永远不会出现在证券.金融这种领域的. ...