<address id="bxxfd"><dfn id="bxxfd"></dfn></address>

<dl id="bxxfd"><video id="bxxfd"></video></dl>

<sub id="bxxfd"><delect id="bxxfd"><ins id="bxxfd"></ins></delect></sub>

      <address id="bxxfd"><var id="bxxfd"></var></address>
      <sub id="bxxfd"><dfn id="bxxfd"><ins id="bxxfd"></ins></dfn></sub>

      <form id="bxxfd"><listing id="bxxfd"></listing></form>

      <thead id="bxxfd"><delect id="bxxfd"><output id="bxxfd"></output></delect></thead>

      <thead id="bxxfd"><var id="bxxfd"><output id="bxxfd"></output></var></thead><sub id="bxxfd"><var id="bxxfd"><output id="bxxfd"></output></var></sub>
      <sub id="bxxfd"><var id="bxxfd"><ruby id="bxxfd"></ruby></var></sub>
      <address id="bxxfd"><dfn id="bxxfd"></dfn></address>

      STL中有关deque、stack、queue、priority_queue

      deque

      deque中的修改类接口STL中有关deque、stack、queue、priority_queue
      由于deque是双端队列,所以有头插头删和尾插尾删操作。
      下面的栈和队列的底层都是通过的deque实现的。
      为什么要用deque作为其底层数据结构呢?
      主要是因为:栈和队列都只需在一头进行操作,故不需要迭代器,只要具有pushback和popback的功能即可,在元素增长时deque比vector效率更高、内存使用率高,所以用deque作为底层数据结构更合适。

      stack

      STL中有关deque、stack、queue、priority_queue
      根据文档里的内容我们可以看到stack中有这些接口。
      在使用时要包含stack头文件
      因为其底层是用deque实现的:所以有关它的模拟实现也就是对deque的一个封装。
      例如:

      template<class T,class Container=deque<T>>
          class stack//栈
          {
          public:
              stack()
              {
      
              }
      
              void push(const T&data)
              {
                  _con.push_back(data);
              }
              private:
              Container _con;
          }


      queue

      STL中有关deque、stack、queue、priority_queue
      注意队列不同的是由front和back操作,分别是队首和队尾元素。



      priority_queue优先队列

      底层使用堆实现的!
      创建优先队列的默认是按照大堆(比较参数是less)方式!也就是说每个根节点都大于它的孩子节点。

      构造函数:std::priority_queue<int, std::vector<int>, std::greater<int> >
      third (myints,myints+4);
      上例是构造了一个小堆类型的优先级队列
      它的模板参数列表:template&lt;class T, class Container=vector&lt;T&gt;, class Compare=less&lt;T&gt;&gt;
      所以如果想要用小堆创建对象时要把第三个参数改为great。

      这里我们把库函数中的less这个函数拿来看一下:

      template<class _Ty = void>
          struct less
              : public binary_function<_Ty, _Ty, bool>
          {   // functor for operator<
          bool operator()(const _Ty& _Left, const _Ty& _Right) const
              {   // apply operator< to operands
              return (_Left < _Right);
              }
          };

      如果在优先级队列内存放自定义类型数据,需要需要用户提供<、>的重载,有时也要对提供比较器规则,参考less和greater在库函数中的实现,即对()进行重载。


      模拟实现优先级队列:

      namespace mine
          {
              template <class T, class Container = vector<T>, class Compare = less<T>>//默认(less)创建的是大堆
              class priority_queue
              {
              public:
                  priority_queue()
                      :c()
                  {}
      
                  template<class Iterator>
                  priority_queue(Iterator first, Iterator last)//区间构造,将root进行向下调整
                      : c(first, last)
                  {
                      // 将c中的元素调整成堆的结构
                      int count = c.size();
                      int root = ((count - 2) >> 1);
                      for (; root >= 0; root--)
                          AdjustDown(root);
                  }
      
                  void push(const T & data)
                  {
                      c.push_back(data);
                      AdjustUP(c.size()-1);//传入下标
                  }
      
                  void pop()//头删的话先将头元素与最后一个元素交换,把最后一个元素删掉后再执行向下排序
                  {
                      if (empty())
                          return;
                      else
                      {
                          swap(c.front(), c.back());
                          c.pop_back();
                          AdjustDown(0);
                      }
                  }
                  int size()const
                  {
                      return c.size();
                  }
                  bool empty()const
                  {
                      return c.empty();
                  }
                  const T & top()const
                  {
                      return c.front();
                  }
      
              private:
      
                  //这里的向上调整和向下调整都是大堆模式
                  void AdjustDown(int parent)//向下调整算法,把较小元素调整下去
                  {
                      int child = parent * 2 + 1;//child代表下标
                      while (child < c.size())
                      {
                          //找到以parent为根的较大的孩子
                          //如果根有右孩子并且左孩子比右孩子小,让child等于右孩子
                          //即child此时为较大的孩子
                          if (child + 1 < c.size() && com(c[child], c[child + 1]))
                          {
                              child = child + 1;
                          }
                          //如果孩子节点比父亲节点大则交换
                          if (com(c[parent], c[child]))
                          {
                              swap(c[child], c[parent]);
                              parent = child;
                              child = parent * 2 + 1;
                          }
                          else
                              return;
                      }
                  }
      
                  void AdjustUP(int child)//向上调整算法,将较大元素调整上去
                  {
                      int parent = (child - 1) >> 1;
                      while (child)//没有到根的话继续循环
                      {
                          //如果父亲节点比孩子节点小,交换
                          //将较大节点调整到根位置
                          if (com(c[parent], c[child]))
                          {
                              swap(com(c[parent], c[child]));
                              child = parent;
                              parent = (child - 1) >> 1;
                          }
                          else
                          {
                              return;
                          }
                      }
                  }
              private:
                  Container c;
                  Compare com;
              };
          }

      这里最重要的就是向上调整和向下调整算法,同时也要注意比较规则在其中的用法。详细过程见代码注释。

      相关文章
      相关标签/搜索
      三十码期期必中√资料2020年香港马会最快手机报码开奖结果现场直播历史查询记录二四六天天好彩免费资料大全网 外汇| 微博| 贵定县| 永顺县| 石泉县| 宿州市| 扎兰屯市| 郧西县| 龙胜| 黑水县| 乐清市| 徐水县| 三江| 通化市| 固原市| 澄迈县| 楚雄市| 阿尔山市| 武山县| 垫江县| 清水县| 军事| 阜城县| 遵化市| 紫阳县| 林芝县| 舒城县| 绥中县| 区。| 东乡| 潮州市| 安远县| 思茅市| 察隅县| 腾冲县| 湖南省| 兖州市| 九龙坡区| 卢湾区| 洮南市| 阿图什市| 河曲县| 青州市| 衡阳市| 揭东县| 锡林浩特市| 青川县| 肇庆市| 比如县| 三台县| 晴隆县| 洪雅县| 虞城县| 柳州市| 龙江县| 彭山县| 策勒县| 阳新县| 黑水县| 镇巴县| 惠东县| 峨边| 保定市| 兴仁县| 南城县| 文水县| 汉川市| 轮台县| 客服| 深圳市| 布尔津县| 那曲县| 敦煌市| 大同县| 宁夏| 简阳市| 曲靖市| 周至县| 成都市| 五华县| 离岛区| 潼南县| 达日县| 溧水县| 越西县| 策勒县| 东辽县| 牡丹江市| 台湾省| 蚌埠市| 栾川县| 潜江市| 滦南县| 松滋市| 蚌埠市| 延安市| 广丰县| 新津县| 延边| 闸北区| 孙吴县| 揭西县| 梓潼县| 溆浦县| 郎溪县| 宣武区| 富源县| 定陶县| 和龙市| 广南县| 农安县| 青岛市| 南漳县| 康马县| 青海省| 伊宁县| 南宫市| 江西省| 克东县| 合阳县| 土默特左旗| 澎湖县| 湘西| 綦江县| 鄯善县| 虎林市| 那坡县| 泸溪县| 桓台县| 永修县| 即墨市| 榆树市| 山东| 石嘴山市| 萍乡市| 榆中县| 九江市| 南乐县| 报价| 银川市| 玉树县| 通渭县| 汝阳县| 阆中市| 文山县| 浙江省| 军事| 通榆县| 高碑店市| 庆云县| 南靖县| 眉山市| 罗甸县| 呼图壁县| 昭通市| 武山县| 略阳县| 苍溪县| 黔江区| 婺源县| 临汾市| 大理市| 浙江省| 温泉县| 余江县| 渝中区| 巍山| 巫山县| 敦煌市| 福州市| 苍南县| 安新县| 中宁县| 荔浦县| 新疆| 古浪县| 封开县| 清苑县| 金山区| 平武县| 龙陵县| 资阳市| 峨山| 巫溪县| 咸宁市| 崇明县| 泉州市| 嫩江县| 晋宁县| 射洪县| 即墨市| 闽侯县| 宽甸| 保德县| 南澳县| 八宿县| 高阳县| 阿巴嘎旗| 文成县| 尚义县| 鹰潭市| 台州市| 汉阴县| 望谟县| 云霄县| 南昌市| 波密县| 永城市| 石柱| 桃园县| 黎川县| 施甸县| 曲麻莱县| 积石山| 瑞丽市| 玉溪市| 乐昌市| 徐闻县| 新民市| 呈贡县| 上杭县| 湟源县| 娄底市| 榆林市| 漳州市| 获嘉县| 西峡县| 阳朔县| 福贡县| 千阳县| 康马县| 小金县| 固镇县| 新源县| 江北区| 阳江市| 安康市| 平遥县| 阿城市| 衡东县| 益阳市| 钟祥市| 鸡东县| 承德市| 北辰区| 右玉县| 江西省| 汉寿县| 岳西县| 门源| 司法| 江城| 囊谦县| 剑河县| 泊头市| 德州市| 大方县| 营山县| 青海省| 区。| 鄂伦春自治旗| 长岭县| 苗栗市| 阳朔县| 诸暨市| 尉犁县| 龙南县| 靖州| 花莲县| 洞头县| 滨州市| 安乡县| 涪陵区| 沙坪坝区| 武陟县| 定南县| 大余县| 哈尔滨市| 屏山县| 依兰县| 银川市| 梅州市| 保亭| 辉南县| 沭阳县| 鄢陵县| 城口县| 深水埗区| 迁安市| 临城县| 资讯| 枣阳市| 浦城县| 上栗县| 潞城市| 中卫市| 田阳县| 阿尔山市| 胶南市| 合山市| 若尔盖县| 新龙县| 合作市| 洛浦县| 玛纳斯县| 沅江市| 神农架林区| 杭州市| 白沙| 苗栗县| 卢氏县| 阿拉善盟| 灌阳县| 长顺县| 吉安县| 安宁市| 西和县| 芮城县| 北京市| 西宁市| 巴南区| 原阳县| 黎城县| 噶尔县| 肃宁县| 株洲市| 静海县| 沁阳市| 阿克苏市| 徐水县| 晋中市| 洛南县| 静安区| 炎陵县| 玉门市| 咸宁市| 依安县| 西乡县| 榆林市| 湛江市| 五常市| 丰原市| 泸定县| 平谷区| 林甸县| 肇庆市| 泾川县| 阿巴嘎旗| 宣恩县| 皋兰县| 永清县| 通辽市| 游戏| 南部县| 平昌县| 抚松县| 铁力市| 桃园市| 屏山县| 营口市| 建水县| 白沙| 怀来县| 宜章县| 思南县| 泽普县| 手游| 望谟县| 文山县| 白玉县| 鹤山市| 邵阳市| 崇仁县| 呼伦贝尔市| 肇东市| 鲁甸县| 贵定县| 铅山县| 青海省| 新沂市| 瑞丽市| 海晏县| 定襄县| 镇江市| 绥中县| 长乐市| 泰州市| 永吉县| 武功县| 天长市| 桦甸市| 井研县| 孝义市| 福清市| 淮阳县| 商南县| 仙居县| 九龙坡区| 游戏| 绥中县| 光山县| 鱼台县| 江津市| 许昌县| 武义县| 德令哈市| 建昌县| 三台县| 和田县| 阳信县| 贡山| 墨江| 博白县| 板桥市| 鄂温| 马公市| 原平市| 屯留县| 绥化市| 台前县| 临朐县| 金寨县| 大宁县| 四平市| 六盘水市| 故城县| 孟州市| 剑河县| 徐水县| 大渡口区| 拉孜县| 北川| 台南县| 望奎县| 灵璧县| 福清市| 鄂伦春自治旗| 吉林省| 松桃| 怀集县| 龙南县| 临汾市| 盈江县| 平陆县| 日照市| 遂溪县| 扶绥县| 洱源县| 都匀市| 山东| 邯郸市| 香港| 沙坪坝区| 德庆县| 赣州市| 吉林省| 读书| 麦盖提县| 乌苏市| 湖南省| 磴口县| 海南省| 怀宁县| 吴堡县| 托克托县| 潍坊市| 毕节市| 攀枝花市| 田东县| 岑溪市| 新乡市| 建阳市| 郸城县| 巩义市| 卫辉市| 南乐县| 珲春市| 河间市| 廉江市| 文水县| 南漳县| 芷江| 嘉兴市| 枣庄市| 祥云县| 柯坪县| 灵寿县| 毕节市| 永州市| 榆中县| 天全县| 淮南市| 乌拉特中旗| 广昌县| 彭阳县| 会昌县| 额敏县| 贺州市| 盐城市| 靖边县| 潞城市| 台州市| 新蔡县| 普宁市| 思南县| 隆安县| 富锦市| 灌南县| 新巴尔虎左旗| 苏尼特右旗| 克什克腾旗| 平安县| 镇平县| 望都县| 梧州市| 玛多县| 芜湖县| 从化市| 澄迈县| 秀山| 花莲市| 瑞金市| 吉安县| 莱阳市| 成安县| 边坝县| 广东省| 朝阳县| 泸西县| 阜宁县| 石门县| 景泰县| 克东县| 邵阳县| 曲周县| 靖安县| 资兴市| 昌都县| 区。| 定日县| 万州区| 博罗县| 合水县| 刚察县| 宣威市| 惠东县| 石城县| 乌什县| 义乌市| 泸溪县| 大方县| 邯郸市| 商丘市| 宜州市| 方山县| 横峰县| 唐河县| 安阳县| 花垣县| 东阿县| 东乡县| 玉田县| 连州市| 迁安市| 芜湖县| 玉溪市| 屏东市| 清水河县| 若尔盖县| 长春市| 滕州市| 建始县| 象州县| 合水县| 亚东县| 泰安市| 广州市| 新邵县| 锡林郭勒盟| 都兰县| 陆川县| 濉溪县| 革吉县| 望江县| 湟源县| 鸡东县| 双峰县| 洛川县| 体育| 安平县| 关岭| 巴马| 阳朔县| 桃园县| 大方县| 邵东县| 万年县| 神池县| 乌鲁木齐县| 乡城县| 甘南县| 乐东| 玉环县| 福海县| 木兰县| 塔河县| 冕宁县| 大同市| 富阳市| 宝应县| 永清县| 渝中区| 光泽县| 四子王旗| 嘉义市| http://hz0j3r7vo.fun http://jx1870fatherv.fun http://m.jx1870findv.fun http://m.jx1870forzatv.fun http://wap.jx1870focusv.fun http://m.jx1870izpactv.fun http://m.hz0j4r4vo.fun http://jx1870heatv.fun http://www.jx1870fastv.fun http://m.hz0j1r6vo.fun http://jx1870flyv.fun http://www.jx1870helpv.fun http://hz0j2r0vo.fun http://m.hz0j0r9vo.fun http://wap.jx1870izagev.fun http://www.jx1870japanv.fun http://m.jx1870fruitv.fun http://jx1870identifyv.fun