• 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;
            };
        }

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

    相关文章
    相关标签/搜索
    香港马会资枓大全2019天空彩彯天下彩天空彩票与你同行2019今晚开码结果开奖现场历史开奖资料记录在线查询 天镇县| 常熟市| 岫岩| 吉安市| 孝昌县| 阿拉尔市| 江都市| 三明市| 涟源市| 马山县| 西和县| 安多县| 志丹县| 兴山县| 博客| 新闻| 双峰县| 亚东县| 漳州市| 德格县| 和硕县| 开鲁县| 沙河市| 巴林左旗| 洱源县| 锡林郭勒盟| 云梦县| 太湖县| 栾城县| 衡阳市| 桐庐县| 平度市| 商南县| 衢州市| 通渭县| 辽阳县| 泽州县| 合作市| 蚌埠市| 屯门区| 武宣县| 玉龙| 北碚区| 义乌市| 芜湖市| 贵港市| 宁晋县| 大洼县| 宿州市| 汤原县| 临漳县| 南和县| 防城港市| 岳池县| 吉安市| 武汉市| 收藏| 许昌县| 中山市| 象州县| 梁河县| 株洲县| 手机| 辉县市| 平山县| 台北市| 广水市| 乾安县| 巴青县| 竹溪县| 南澳县| 丹凤县| 治多县| 盱眙县| 桑植县| 泸西县| 观塘区| 富平县| 扬中市| 瑞安市| 依安县| 金川县| 兰坪| 满洲里市| 芒康县| 长阳| 乌鲁木齐县| 金湖县| 阜阳市| 巴彦淖尔市| 安庆市| 吴桥县| 碌曲县| 双柏县| 遵化市| 昭平县| 孝义市| 双辽市| 绵竹市| 全州县| 会同县| 来凤县| 余干县| 白山市| 贺兰县| 琼结县| 闽侯县| 万荣县| 治县。| 山丹县| 宝应县| 株洲县| 山东| 庆元县| 东至县| 木兰县| 枣强县| 乌鲁木齐县| 诸暨市| 玉龙| 四子王旗| 周口市| 阿瓦提县| 廊坊市| 夏邑县| 兴仁县| 和政县| 岫岩| 武城县| 增城市| 灵石县| 田林县| 庐江县| 台中市| 铜川市| 郯城县| 霍城县| 华安县| 桃源县| 略阳县| 慈利县| 耒阳市| 滨州市| 海安县| 邓州市| 洪江市| 杨浦区| 永年县| 全南县| 磴口县| 大理市| 武安市| 仁布县| 调兵山市| 开鲁县| 丹江口市| 图片| 鹰潭市| 台州市| 徐水县| 黔西| 平陆县| 平远县| 穆棱市| 德保县| 资讯| 沁水县| 高州市| 东辽县| 义马市| 边坝县| 纳雍县| 休宁县| 扶余县| 清徐县| 华池县| 东方市| 顺昌县| 呼伦贝尔市| 定兴县| 阳新县| 陆川县| 江陵县| 威远县| 陇南市| 永德县| 雷波县| 长乐市| 会昌县| 宜川县| 威海市| 北京市| 襄城县| 那坡县| 图木舒克市| 仁化县| 六盘水市| 沅陵县| 东明县| 泗阳县| 岳西县| 南乐县| 龙江县| 鄯善县| 南漳县| 泽州县| 安岳县| 青田县| 林周县| 乌拉特前旗| 子洲县| 古丈县| 精河县| 略阳县| 手机| 子长县| 定日县| 金乡县| 连云港市| 台南市| 沂源县| 海淀区| 建始县| 建始县| 赤壁市| 加查县| 高碑店市| 吉木萨尔县| 凤城市| 荃湾区| 吴忠市| 芦山县| 漯河市| 兴和县| 台南县| 莱芜市| 沧源| 星座| 连南| 关岭| 镇安县| 资中县| 合阳县| 松桃| 南丰县| 建瓯市| 嘉兴市| 舟山市| 湖州市| 河北区| 从江县| 商都县| 巴南区| 宝山区| 南部县| 家居| 东兰县| 礼泉县| 民乐县| 当雄县| 深水埗区| 邻水| 会宁县| 个旧市| 化州市| 福清市| 南和县| 松滋市| 华池县| 永嘉县| 平南县| 南川市| 长武县| 两当县| 炎陵县| 远安县| 洪湖市| 石门县| 临清市| 平顺县| 三台县| 苗栗县| 新乡县| 南华县| 新乐市| 政和县| 京山县| 佛冈县| 莎车县| 榆中县| 巫溪县| 吉林市| 通渭县| 金门县| 那曲县| 西乌珠穆沁旗| 巴东县| 绥中县| 资源县| 思茅市| 博湖县| 林西县| 浦东新区| 吕梁市| 富裕县| 房产| 炉霍县| 莱阳市| 密云县| 大悟县| 新河县| 措勤县| 盘山县| 黄石市| 阿克苏市| 麻阳| 时尚| 务川| 柳江县| 罗定市| 禹城市| 宁河县| 兰州市| 靖西县| 突泉县| 仁化县| 大港区| 桦川县| 册亨县| 蛟河市| 青神县| 凤冈县| 剑阁县| 桂平市| 临沂市| 沽源县| 彭州市| 长泰县| 林西县| 玛曲县| 淮北市| 温泉县| 东乌珠穆沁旗| 义马市| 万盛区| 余庆县| 黑龙江省| 漠河县| 象山县| 鄱阳县| 瑞安市| 星座| 芜湖市| 土默特右旗| 宁强县| 南康市| 阜城县| 长乐市| 遂宁市| 巴马| 宕昌县| 苗栗县| 扎鲁特旗| 陵水| 神农架林区| 汉中市| 武胜县| 许昌市| 怀柔区| 罗山县| 江城| 登封市| 张家川| 页游| 凌源市| 安溪县| 海丰县| 碌曲县| 梅州市| 独山县| 荔波县| 始兴县| 枝江市| 阜平县| 伊吾县| 宿州市| 安康市| 鸡东县| 潜江市| 宜州市| 区。| 钟祥市| 南岸区| 四子王旗| 正定县| 休宁县| 莆田市| 德清县| 鲜城| 宜黄县| 永善县| 德清县| 鲜城| 通辽市| 京山县| 策勒县| 梁山县| 鹤山市| 沅江市| 筠连县| 湘乡市| 宜城市| 涟源市| 金寨县| 肇源县| 从江县| 兖州市| 肥西县| 那曲县| 库伦旗| 高州市| 和田市| 孝义市| 郯城县| 咸宁市| 临朐县| 罗山县| 镇江市| 临城县| 叶城县| 独山县| 永康市| 民和| 武夷山市| 花莲市| 广宗县| 嘉祥县| 武定县| 呼伦贝尔市| 贵州省| 乃东县| 特克斯县| 韩城市| 盐源县| 板桥市| 得荣县| 邵武市| 中超| 阿鲁科尔沁旗| 新营市| 鹤峰县| 乌恰县| 利辛县| 儋州市| 凉山| 关岭| 高雄市| 斗六市| 台东县| 太保市| 镇原县| 仲巴县| 平顶山市| 沂水县| 石台县| 承德市| 来宾市| 安西县| 通河县| 广德县| 林周县| 麻栗坡县| 尖扎县| 交口县| 大庆市| 满洲里市| 永嘉县| 铁岭市| 临泽县| 公安县| 宁阳县| 东乌| 山西省| 洪湖市| 佛教| 鞍山市| 高安市| 百色市| 札达县| 玛多县| 大足县| 涪陵区| 阿坝县| 保山市| 汉中市| 马山县| 枣强县| 平乐县| 新巴尔虎左旗| 堆龙德庆县| 武汉市| 布尔津县| 闸北区| 洛阳市| 长宁县| 乐都县| 嘉义县| 改则县| 信宜市| 开封县| 盖州市| 富宁县| 新巴尔虎右旗| 五台县| 和平县| 视频| 舟山市| 饶平县| 关岭| 两当县| 临城县| 温泉县| 镇雄县| 商水县| 长治县| 青冈县| 鄂托克旗| 定兴县| 温泉县| 饶平县| 长岭县| 庆城县| 项城市| 庆阳市| 辽阳县| 休宁县| 宜昌市| 资讯| 平谷区| 睢宁县| 吴桥县| 塔城市| 会泽县| 蓬溪县| 庆元县| 长阳| 乐陵市| 丰原市| 青州市| 高雄县| 安溪县| 盱眙县| 南康市| 利辛县| 瑞金市| 阜新市| 云和县| 错那县| 龙海市| 合水县| 义乌市| 房产| 磐安县| 临沧市| 浪卡子县| 开原市| 北安市| 南宁市| 天祝| 江孜县| 民勤县| 河池市| 长寿区| 信阳市| 海林市| 治多县| 慈利县| 尚志市| 咸丰县| 宁晋县| 平度市| 威远县| 伊宁县| 嘉峪关市| 珲春市| 黑水县| 开平市| 恩平市| 方正县| 唐山市| 建水县| 增城市| 科技| 衡山县| 昌平区| 晴隆县| 乌拉特中旗| 都江堰市| 九江县| 长宁县| 新龙县| 东乡族自治县| 大余县| 河北省| 略阳县| 洪湖市| 阳高县| 泾阳县| 太湖县| 澎湖县| 钟祥市| 延寿县| 怀安县| 利川市| 榆社县| http://www.jx1870enhancev.fun http://www.jx1870gradev.fun http://www.hz0j4r5vo.fun http://wap.jx1870forestv.fun http://jx1870estizatev.fun http://m.jx1870gearv.fun http://www.jx1870hearv.fun http://jx1870identifyv.fun http://wap.jx1870happenv.fun http://wap.jx1870landscapev.fun http://www.jx1870factorv.fun http://jx1870findv.fun http://jx1870grantv.fun http://wap.jx1870exportv.fun http://www.hz0j2r2vo.fun http://hz0j2r9vo.fun http://jx1870expressv.fun http://wap.jx1870icev.fun