您的位置:首页 > 财经 > 金融 > 天津电子商务网站建设公司_ 菠萝菠萝蜜在线高清_东莞网站建设方案报价_搜索引擎营销的步骤

天津电子商务网站建设公司_ 菠萝菠萝蜜在线高清_东莞网站建设方案报价_搜索引擎营销的步骤

2025/3/10 17:05:50 来源:https://blog.csdn.net/2401_86449430/article/details/145792579  浏览:    关键词:天津电子商务网站建设公司_ 菠萝菠萝蜜在线高清_东莞网站建设方案报价_搜索引擎营销的步骤
天津电子商务网站建设公司_ 菠萝菠萝蜜在线高清_东莞网站建设方案报价_搜索引擎营销的步骤

一.模拟实现stack和queue

STL中的stac和queuek是通过容器适配器来实现的,并不是直接实现栈。那什么是容器适配器呢?

举一个简单的例子,不同的插座需要不同的插头来连接,这时候我们用一个插座适配器,我们就不需要关心自己本身的插头,相当于加了一层中间层。

在STL中stack和queue就像适配器一样,只是对其他容器的接口进行封装,例如stack和queue在STl中就是用deque进行封装。

下面我们来进行模拟实现:

namespace ge
{template<class T,class Container = deque<T>>//不关心container是什么容器,container已经实现好的容器,通过对stack重新封装来完成class stack{public:stack()//构造函数没有内容会默认走private下的构造{}void push(const T& x){_con.push_back(x);}void pop(){_con.pop();}T& top(){return _con.top();}const T& top() const{return _con.top();}size_t size() const{return _con.size();}bool empty()const{return _con.empty();}private:Container _con;};
}

这里我的private内容是一个模板,用来传容器类型例如vector,list这样的。函数构造时会直接走private部分。其余部分就是对容器进行一个函数调用,较为简单。

namespace wen
{template<class T,class Container = deque<T>>class queue{public:queue(){}void push(const T& x){_con.push_back(x);}void pop(){_con.pop();}T& back(){return _con.back();}const T& back()const{return _con.back();}T& front(){return _con.front;}const T& front() const{return _con.front();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}

stack和queue只需要在头尾进行访问不需要访问中间的元素,因此不需要迭代器来遍历。 

二.deque

deque是一个支持随机访问的容器,他的功能和vector和list功能类似。那么为什么要重新单独实现一个deque呢?vector优点在于支持下标随机访问,但是在扩容和中间插入时有一定效率缺陷。list可以高效的进行插入,但不支持随机访问。

所以deque是结合了两者的优点创建出来的容器,对两者进行功能的融合。

deque是一个双端队列支持首尾的插入和删除。deque存储数据时是使用一个buffer数组,当buffer数组存储满之后,再重新开辟一个buffer数组进行存储。通过一个中控器存储数组的指针将各个数组构造出一个假象的物理连续,其实他们在空间上并不是连续的。

与vector比较deque的优势是在头部插入和删除时不需要移动元素,效率较高。扩容时也不需要搬移元素。与list相比,他的底层空间是连续的空间利用率高。

但deque有个致命缺陷,当需要遍历时效率低下。

那为什么要选择deque作为stack和queue的底层容器呢?

stack和queue不需要遍历(不需要迭代器),只需要在两端进行操作。在数据增长时deque不需要搬移数据比vector效率要高。这样就完美避开了deque的缺点结合了其优点。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com