从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)
从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 */
};
小结
关于iOS为什么不实现std::stack和std::queue,可能苹果觉得NSMutableArray完全可以通过deque的性质轻易的实现FILO或FIFO特性,再实现就是多此一举了吧。
ps:CF源码我还没看完,继续啃吧。
参考
从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)的更多相关文章
- 容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例
一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/d ...
- C++ STL基本容器的使用(vector、list、deque、map、stack、queue)
1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...
- [STL]deque和stack、queue
怎么说呢,deque是一种双向开口的连续线性空间,至少逻辑上看上去是这样.然而事实上却没有那么简单,准确来说deque其实是一种分段连续空间,因此其实现以及各种操作比vector复杂的多. 一.deq ...
- C++ std::stack
std::stack template <class T, class Container = deque<T> > class stack; LIFO stack Stack ...
- C++ std::stack 基本用法
#include <iostream> #include <string> #include <stack> // https://zh.cppreference. ...
- 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 ...
- 剑指offer——stack与queue的互相实现
我们知道,stack和queue是C++中常见的container.下面,我们来探究下如何以stack来实现queue,以及如何用queue来实现stack. 首先,先了解下stack与queue的基 ...
- C++ STL:stack和queue
http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/ ...
- c++ List、Vector、Stack、Queue使用
一.List使用 引入头文件#include <list> List基本函数Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比 ...
随机推荐
- android奋战的一周
移动开发项目终于开始了,我也开始紧张起来了,就靠着培训时候学的一知半解的知识,作为一个主力不得不逼着自己不停的做实验,不停的学习. 有辛苦就有回报,我也对android开发中整体的框架有了些许的了解. ...
- 为用户增加sudo权限(修改sudoers文件)
在使用Linux系统过程中,通常情况下,我们都会使用普通用户进行日常操作,而root用户只有在权限分配及系统设置时才会使用,而root用户的密码也不可能公开.普通用户执行到系统程序时,需要临时提升权限 ...
- 使用Java POI来选择提取Word文档中的表格信息
通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...
- lightoj1336数论基础
#include<iostream> #include<cstdio> #include<cmath> #define ll long long using nam ...
- Spring框架 jar包下载
Spring框架下载 打开网址https://repo.spring.io 点击左侧边栏第二个按钮 点击 在输入框输入spring-framework点击Search 找到你需要的版本下载就好 教程到 ...
- Layout基本属性总结
在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),GridLayout(网格布局),RelativeLayout(相对布局),T ...
- TPshop分销功能的使用与表设计
首先来段科普,摘自百度百科: 在西方经济学中,分销 的含义是建立销售渠道的意思,根据著名的营销大师菲利普·科特勒的定义,分销渠道(Distribution Channel)又或者叫营销渠道(Marke ...
- 关于删除数组中重复元素的lintcode代码
时间自由度为o(n),空间自由度为o(1); class Solution {public: /** * @param A: a list of integers * @retu ...
- 手机共享成wifi热点电脑无法上网的问题
第二次遇到这样的问题,每次百度都不能解决我遇到的问题.上一次已经自己鼓捣着解决了,后来忘记怎么弄好的.第二次遇到这个问题,又是浪费了许多时间后,偶然弄好了,突然想起来上次就是这样弄好的.所以就针对我自 ...
- 记录——时间轮定时器(lua 实现)
很长一段时间里,我错误的认识了定时器.无意中,我发现了“时间轮”这个名词,让我对定时器有了新的看法. 我错误的认为,定时器只需要一个 tick 队列,按指定的时间周期遍历队列,检查 tick 倒计时满 ...