适配器
适配器是一种设计模式,我们最终实现的功能可以通过不同的路径来实现,那么这个路径就可以称作适配器。
例如下面的例子:
那么在c++中也有适配器,例如stack、queue、priority_queue,它们并不是使用了什么新的内存形式,而是利用适配了其他的容器,然后来实现自己的功能。下面我们用几个例子来举例
栈举例
如果有在C语言的时候学习数据结构的同学就知道,我们在实现stack的时候,发现和顺序表的代码其实是差不多的,就是因为内存形式是相同的,顺序表的内存特点可以支持栈的功能实现。
但是我们的栈并不是只能用顺序表实现,也可以用链表和双端队列,所以栈可以利用很多的容器来实现自己的功能,这种就叫适配器。
优先级队列举例
我们再拿优先级队列来看,优先级队列就是堆,堆需要支持随机访问来快速找到子节点和父节点。而堆的实际结构就是连续内存(连续内存就可以快速访问),所以像顺序表、双端队列(双端队列虽然不是连续内存,但是它的下标访问也是比较快的)都可以拿来给堆来实现相应的功能,只是顺序表是最优选择而已。
队列举例
队列只要求可以一边进另一边出,两边可以读取,那么只要是满足这些要求的容器都可以被适配,例如双端队列和链表,我们的顺序表甚至也行,只是在头部操作的时候效率不高而已。
总结
适配器其实就是利用其他容器的内存特点和接口来实现自己的功能的特殊容器,stl并不把它叫做容器,因为根本上就是用的别人的,叫适配器更加合理贴切。
我们进行容器来进行适配的时候,要结合适配器需要的内存特点来合理筛选,保证效率最优。