一.容器适配器
其实在使用模板时,我们不仅可以使用类模板,还可以使用容器模板,这就是一个容器适配器,我们可任意给模板实例化不同的容器,然后就可以使用容器里的接口。
template<class T,class Containers>
我们知道,栈可以用数组实现也可以用链表实现,以前在C语言那里,如果我们想要两个底层不同的栈,要么写两个栈,要么用typedef,但这做不到自由控制;在C++中,我们可以容器适配器解决这个问题,数组链表秒切换。
注意使用的接口必须是你实例化的容器所拥有的,否则会报错。
例:
vector容器没有头插(push_front)和头删(pop_front)接口
list却有这两个接口,所以在使用时要特别注意。
二.模拟实现stack
库里栈的模板是这样的,这个deque是一个双端队列,它同时拥有vector和list的接口。
上图是栈的接口,都很简单,栈符合先进后出,下面就让我们用容器适配器模拟实现栈吧。
源码
1. template<class T,class Containers=deque<T>> //容器适配器 2. class stack //栈 3. { 4. public: 5. void push(const T& val) //入栈,即尾插 6. { 7. _con.push_back(val); 8. } 9. 10. void pop() //出栈,即尾删 11. { 12. _con.pop_back(); 13. } 14. 15. const T& top() const //取栈顶元素 16. { 17. return _con.back(); 18. } 19. 20. bool empty() 21. { 22. return _con.size() == 0; 23. } 24. 25. size_t size() const 26. { 27. return _con.size(); 28. } 29. private: 30. Containers _con; 31. };
三.模拟实现queue
队列和栈差不多,但队列是先进先出原则。
源码
1. template<class T,class Containers=deque<T>> 2. class queue //队列 3. { 4. public: 5. void push(const T&val) //入队列,即尾插 6. { 7. _con.push_back(val); 8. } 9. 10. void pop() //出队列,即头删 11. { 12. _con.pop_front(); 13. } 14. 15. T& front() //取队列的第一个元素 16. { 17. return _con.front(); 18. } 19. 20. const T& front() const 21. { 22. return _con.front(); 23. } 24. 25. bool empty() 26. { 27. return _con.size() == 0; 28. } 29. 30. size_t size() const 31. { 32. return _con.size(); 33. } 34. private: 35. Containers _con; 36. };
🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻
😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩
😍😁谢谢你的阅读。😸😼