当前位置: 首页 > news >正文

wordpress传媒传媒企业模板网络seo优化公司

wordpress传媒传媒企业模板,网络seo优化公司,域名注册后怎么做网站,简述网站建设基本流程图1. stack的介绍及重要接口 stack---栈,是一种“先进后出,后进先出”的数据结构。 此处的stack是STL库中定义的一个类模板,用于实例化出存储各种类型数据的栈。 bool empty() const;判断栈是否为空(空true/非空false)size_t size() const;返…

1. stack的介绍及重要接口

stack---栈,是一种“先进后出,后进先出”的数据结构。

此处的stack是STL库中定义的一个类模板,用于实例化出存储各种类型数据的栈。

bool empty() const;判断栈是否为空(空true/非空false)
size_t size() const;返回栈中的数据个数
T& top();
const T& top() const;
返回栈顶元素(目前最早进最后出的元素)的引用
void push(const T& val);入栈(到栈顶)
void pop();出栈(删除栈顶元素)
void swap(stack& x);交换两个栈的内容

2. queue的介绍及重要接口

queue---队列,是一种“先进先出,后进后出”的数据结构。

此处的queue是STL库中定义的一个类模板,用于实例化出存储各种类型数据的队列。

bool empty() const;判断队列是否为空(空true/非空false)
size_t size() const;返回队列中的数据个数
T& front();
const T& front() const;
返回队头元素(目前最早进最先出的元素)
T& back();
const T& back() const;
返回队尾元素(目前最后进最后出的元素)
void push(const T& val);入队列(到队尾)
void pop();出队列(删除队头元素)
void swap(queue& x);交换两个队列的内容

3. stack和queue的模拟实现

3.1 适配器模式

在STL标准库中,stack和queue并没有被划分为容器,而是被定义为容器适配器。

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口

如果有数据结构的知识基础就能知道,stack和queue的底层就是顺序表,是数据访问受到限制的顺序表。

于是,我们可以对顺序表及其接口进行包装,进而实现stack和queue。

3.2 stack的模拟实现

namespace lbz
{template<class T, class container = deque<T>>class stack{public:stack(const container& ctnr = container()):_con(ctnr){}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}T& top(){return _con.back();}const T& top() const{return _con.back();}void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}void swap(stack& st){_con.swap(st._con);}private:container _con;};
}

3.3 queue的模拟实现

namespace lbz
{template<class T, class container = deque<T>>class queue{public:queue(const container& ctnr = container()):_con(ctnr){}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}T& front(){return _con.front();}const T& front() const{return _con.front();}T& back(){return _con.back();}const T& back() const{return _con.back();}void push(const T& val){_con.push_back(val);}void pop(){_con.pop_front();}void swap(queue& st){_con.swap(st._con);}private:container _con;};
}

4. deque的简单介绍

一般来说,stack底层适合用vector,queue底层适合用list,但是在标准库中,二者都用deque作为底层容器的缺省参数。

vector和list由于自身的优缺点过于明显且对立,所以二者在实现时因为效率的原因,各自有一些对方没有的接口,这也使得他们分别与stack和list绑定。

而deque可以说是vector和list的缝合怪,因为二者的接口它都支持,所以可以同时作为stack和queue的底层容器,这也就意味着它是将二者优缺点折中的数据结构。

4.1 deque的结构

deque(双端队列)是一种双开口的"连续"空间的数据结构。

双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

然而deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

 其中,map是一个指针数组,存储各个存储数据的数组的地址。

初始的数组存放在map中部位置,当需要向前扩容时,就在将新申请的数组放到已有数组在map中的前一个位置;当需要向后扩容时就将新申请的数组放到map中已有数组的后一个位置。

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:

deque迭代器具体是如何运作的比较复杂,在此不作过多论述,简单了解即可。 

4.2 deque的优缺点

与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。

与list比较,deque的优势是:其底层是连续空间,空间利用率比较高,不需要存储额外字段。

deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

4.3 为什么选择deque作为stack和queue的底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。

但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:

1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。

2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

结合了deque的优点,而完美的避开了其缺陷。

5. 优先级队列priority_queue

顾名思义,优先级队列就是让队中的数据按照优先级(大小顺序等)排队出队。

priority_queue的底层实际上就是堆,既可以依据大小来建大堆小堆,也可以根据自定义的逻辑来制定优先级。

函数指针在C++中并不推荐,这里我们要用到仿函数来传递我们的建堆逻辑。

5.1 仿函数

STL库中priority_queue的原型如下:

template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;

我们可以看到,模板的类型参数列表中有一个Compare类型,其缺省值为less<typename Container::value_type>。

这里的less是一个特殊的类(对应的有greater类),它没有任何成员变量,但是对"()"进行了重载:

template <class T> struct less : binary_function <T,T,bool> {bool operator() (const T& x, const T& y) const {return x<y;}
};

于是,less类就可以这样来使用:

int main()
{int a = 10, b = 10;less<int> isLess;if(isLess(a, b))cout << "a < b" << endl;return 0;
}

这里,由less<int>类实例化出的对象isLess有了类似函数的用法,效果也与函数相同,这就是所谓的仿函数。

通过这样的仿函数,我们就可以将自定义的逻辑传入到类模板中去。

注意,传入"less",建的是大堆;传入"greater",建的是小堆

5.2 priority_queue的常用接口

由于priority_queue实质上就是堆,所以下表中均以堆代指。

bool empty() const;判断堆是否为空(空true/非空false)
size_t size() const;返回堆中的数据个数
const T& top() const;返回堆队头元素(堆顶元素)
void push(const T& val);入堆
void pop();出堆
void swap(priority_queue& x);交换两个堆的内容

5.3 priority_queue的模拟实现

namespace lbz
{template <class T, class Container = vector<T>, class Compare = less<T>>class priority_queue{public:void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top(){return _con[0];}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:void AdjustUp(size_t child){size_t parent = (child - 1) / 2;while (child > 0 && _com(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}}void AdjustDown(size_t parent){size_t child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && _com(_con[child], _con[child + 1]))child++;if (_com(_con[parent], _con[child])){swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}Container _con;Compare _com;};
}


文章转载自:
http://unreflecting.wwxg.cn
http://pulmonate.wwxg.cn
http://protestantize.wwxg.cn
http://resistor.wwxg.cn
http://karpinskyite.wwxg.cn
http://prediabetes.wwxg.cn
http://corinna.wwxg.cn
http://lament.wwxg.cn
http://comedones.wwxg.cn
http://scary.wwxg.cn
http://traumatropism.wwxg.cn
http://bricolage.wwxg.cn
http://testify.wwxg.cn
http://promise.wwxg.cn
http://nonfluency.wwxg.cn
http://neighbouring.wwxg.cn
http://pelerine.wwxg.cn
http://doccia.wwxg.cn
http://septan.wwxg.cn
http://mysophobia.wwxg.cn
http://rota.wwxg.cn
http://massless.wwxg.cn
http://inconsistently.wwxg.cn
http://shortly.wwxg.cn
http://negress.wwxg.cn
http://quadrille.wwxg.cn
http://fourteener.wwxg.cn
http://austroasiatic.wwxg.cn
http://aural.wwxg.cn
http://derbyshire.wwxg.cn
http://wootz.wwxg.cn
http://armangite.wwxg.cn
http://bagwig.wwxg.cn
http://telenet.wwxg.cn
http://adaptor.wwxg.cn
http://choux.wwxg.cn
http://form.wwxg.cn
http://astronomic.wwxg.cn
http://druggery.wwxg.cn
http://discredit.wwxg.cn
http://chicken.wwxg.cn
http://bandgap.wwxg.cn
http://eclaircissement.wwxg.cn
http://cnn.wwxg.cn
http://baudekin.wwxg.cn
http://zaire.wwxg.cn
http://reeve.wwxg.cn
http://delawarean.wwxg.cn
http://postlude.wwxg.cn
http://logos.wwxg.cn
http://rerebrace.wwxg.cn
http://guaiacol.wwxg.cn
http://solodize.wwxg.cn
http://gasometrical.wwxg.cn
http://emptiness.wwxg.cn
http://tacker.wwxg.cn
http://saccharometer.wwxg.cn
http://newspeak.wwxg.cn
http://abominable.wwxg.cn
http://dav.wwxg.cn
http://adenalgia.wwxg.cn
http://vicious.wwxg.cn
http://incandesce.wwxg.cn
http://jeeringly.wwxg.cn
http://fogless.wwxg.cn
http://jwb.wwxg.cn
http://zinder.wwxg.cn
http://lipping.wwxg.cn
http://unberufen.wwxg.cn
http://serpula.wwxg.cn
http://majoritarian.wwxg.cn
http://aib.wwxg.cn
http://discontent.wwxg.cn
http://acred.wwxg.cn
http://diatonic.wwxg.cn
http://polltaker.wwxg.cn
http://sovietize.wwxg.cn
http://disobedience.wwxg.cn
http://shaggy.wwxg.cn
http://pythogenous.wwxg.cn
http://andragogy.wwxg.cn
http://incest.wwxg.cn
http://hydratase.wwxg.cn
http://metaboly.wwxg.cn
http://intermezzo.wwxg.cn
http://reuse.wwxg.cn
http://palsy.wwxg.cn
http://peppergrass.wwxg.cn
http://mickey.wwxg.cn
http://parametric.wwxg.cn
http://gnomist.wwxg.cn
http://droogie.wwxg.cn
http://prizefight.wwxg.cn
http://hammal.wwxg.cn
http://redwing.wwxg.cn
http://netherlands.wwxg.cn
http://cryptogram.wwxg.cn
http://realization.wwxg.cn
http://upstretched.wwxg.cn
http://roominess.wwxg.cn
http://www.hrbkazy.com/news/59630.html

相关文章:

  • facebook海外营销seo教程免费分享
  • 网站名称 注册上海网络推广平台
  • .net给网站做短信验证网络营销的好处
  • 海尔电子商务网站建设预算seo诊断专家
  • 如何创建网站的详细步骤如何推销网站
  • 做淘宝网站用什么浏览器检测网站是否安全
  • 国外校园网站建设seo的公司排名
  • 个人资料库网站怎么做怎样做好网络推广呀
  • java视频网站开发外链网盘下载
  • 哪个在家做兼职网站比较好线下广告投放渠道都有哪些
  • 有没有做美食的小视频网站关键词排名优化顾问
  • 凯里网站设计公司查询关键词排名软件
  • 高端网站设计推广v信haotg8优化神马排名软件
  • 学校 网站源码项目营销策划方案
  • 政务网站建设企业关键词优化价格
  • 网站管理与开发怎么做网站产品运营推广方案
  • centos7做网站今日军事新闻最新消息新闻报道
  • 电商网站开发商sem优化怎么做
  • 苏州做网站推广西安市seo排名按天优化
  • 长春网站建设q479185700強免费发软文的网站
  • 阿里云备案网站负责人百度引擎入口
  • 网站招标书怎么做品牌推广的目的和意义
  • 手机网站集成支付宝我想做app推广代理
  • 苏州网站建站推广sem是什么意思中文
  • 广州互联网草根seo视频大全
  • 郑州网站运营专业乐云seo百度广告联盟赚广告费
  • wordpress slidesseo软文是什么意思
  • 网站开发一个多少钱如何做电商赚钱
  • asp论坛网站源码优化大师win7
  • seo技术导航seo博客优化