摘要
本文有可能讲的不是特别清楚,我也是初学者有的理解可能有偏差欢迎指出,文章末附上导图。
目录
摘要
一、什么是适配器
二、STL标准库中stack和queue的底层结构
三、deque
1、deque的原理介绍
2、deque的缺陷
四、反向迭代器
五、思维导图
一、什么是适配器
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
这个就是我在网上看到通用的解释,我自己的理解呢适配器就像是一个转接头,一把万能钥匙,比方说我们使用充电器有安卓的有苹果的有tpc-c的,但是都需要固定的接口才能充电,但是我小时候有一个东西叫做万能充,只需要电池就可以使用,这是我看到适配器的第一想法,下方图片就是一个万能充,他还有各种颜色灯,不同款式的。
二、STL标准库中stack和queue的底层结构
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如下方图片,红色框中的,也就是上篇文章写模拟实现的时候看到的,然后去看了下源码,膜拜大佬。
三、deque
1、deque的原理介绍
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
他的结构如下,不过我看到这个结构第一反应就是一个插排上面插满了插排,那个总的插排就是下方那个横的剩下的插排也都是扯出去用来使用,向下方一样,如下方图二那种,实在没找到合适的,大概就是这几个插排插在一个插排上面那种。
2、deque的缺陷
与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。
四、反向迭代器
在我看了一下源码发现大佬写反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可,如下方代码所示,就是包装的反向迭代器,我用list的测试的,下方一个是正向访问一个是反向访问。
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<iterator, const T&, const T*> const_reverse_iterator;
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
五、思维导图