zoukankan      html  css  js  c++  java
  • deque容器

    一、deque容器基本概念

    deque是“double-ended queue”的缩写,和vector一样,deque也支持随机存取。vector是单向开口的连续性空间,deque则是一种双向开口的连续性空间,所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,vector当然也可以在头尾两端进行插入和删除操作,但是头部插入和删除操作效率极差,无法被接受。

    deque和vector的最大差异?

    一在于deque允许常数时间内对头端进行元素插入和删除操作。

    二在于deque没有容量的概念,因为它是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样“因旧空间不足而重新分配一块更大的空间,然后再复制元素,释放空间”这样的操作不会发生在deque身上,也因此deque没有必要提供所谓的空间保留功能。

    特性总结:

    • 双端插入和删除元素效率较高。
    • 指定位置插入也会导致数据元素移动,降低效率。
    • 可随机存取,效率高。

    二、deque常用API

    1、deque构造函数

    2、deque赋值操作

    3、deque大小操作

    4、deque双端插入和删除操作

    4、deque数据存取

    5、deque插入操作

    三、案例

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <deque>
    using namespace std;
    
    void PrintDeque(deque<int>& d)
    {
        for (deque<int>::iterator it = d.begin();it != d.end();it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    //deque初始化
    void test01()
    {
        deque<int> d1;
        deque<int> d2(10, 5);
        deque<int> d3(d2.begin(), d2.end());
        deque<int> d4(d3);//5 5 5 5 5 5 5 5 5 5
    
        //打印d4
        PrintDeque(d4);
    }
    
    //赋值、大小操作
    void test02()
    {
        deque<int> d1;
        deque<int> d2;
        deque<int> d3;
        d1.assign(10, 5);
        d2.assign(d2.begin(), d2.end());//迭代器指定区间赋值
        d3 = d2;//等号赋值
        d1.swap(d2);//交换两个空间的元素
    
        if (d1.empty())
        {
            cout << "空!" << endl;
        }
        else
        {
            cout << "size:" << d1.size() << endl;
        }
    
        d1.resize(5);//d1本来有10个元素,后5个元素扔掉
    }
    
    //deque容器插入和删除操作
    void test03()
    {
        deque<int> d1;
        d1.push_back(100);
        d1.push_front(200);
        d1.push_back(300);
        d1.push_back(400);
        d1.push_front(500);
    
        PrintDeque(d1);//500 200 100 300 400
    
        int val = d1.front();//拿到要删除的数据
        d1.pop_front();//删除头元素,无返回值
        val = d1.back();//拿到要删除的数据
        d1.pop_back();//删除尾元素,无返回值
    
        PrintDeque(d1);//200 100 300
    }
    
    int main(void)
    {
        //test01();
        //test02();
        test03();
        return 0;
    }
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <deque>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    //评委打分案例(sort算法排序)
    //创建5个选手(姓名,得分),10个评委给5个选手打分
    //得分规则:去除最高分,去除最低分,取出平均分
    //按得分对5名选手进行从大到小排名
    
    //选手类
    class Player
    {
    public:
        Player(){}
        Player(string name,int score):mName(name), mScore(score){}
    public:
        string mName;
        int mScore;
    };
    
    //创建选手
    void Create_Player(vector<Player>& v)
    {
        string nameSeed = "ABCDE";
        for (int i = 0;i < 5;i++)
        {
            Player p;
            p.mName = "选手";
            p.mName += nameSeed[i];
            p.mScore = 0;
    
            v.push_back(p);
        }
    }
    
    void PrintScore(int val)
    {
        cout << val << " ";
    }
    
    //打分
    void Set_Score(vector<Player>& v)
    {
        for (vector<Player>::iterator it = v.begin();it != v.end();it++)
        {
            //当前学生进行打分
            deque<int> dScore;
            for (int i = 0;i < 10;i++)
            {
                int score = rand() % 41 + 60;
                dScore.push_back(score);
            }
    
            //对分数排序 默认从小到大
            sort(dScore.begin(), dScore.end());
            //for_each(dScore.begin(), dScore.end(), PrintScore);
            //cout << endl;
    
            //去除最高分和最低分
            dScore.pop_front();
            dScore.pop_back();
    
            //求平均分
            int totalScore = 0;
            for (deque<int>::iterator dit = dScore.begin();dit!= dScore.end();dit++)
            {
                totalScore += (*dit);
            }
    
            int avgScore = totalScore / dScore.size();
            //保存分数
            (*it).mScore = avgScore;
        }
    }
    
    //排序规则
    bool mycompare(Player& p1, Player& p2)
    {
        return p1.mScore > p2.mScore;
    }
    //根据选手分数排名 sort默认从小到大,但我们希望从大到小
    void Print_Rank(vector<Player>& v)
    {
        //排序
        sort(v.begin(), v.end(), mycompare);
        //打印
        for (vector<Player>::iterator it = v.begin();it != v.end();it++)
        {
            cout << "姓名" << (*it).mName << "得分:" << (*it).mScore << endl;
        }
    }
    int main(void)
    {
        //定义vector容器,保存选手信息
        vector<Player> vPlist;
        Create_Player(vPlist);
        Set_Score(vPlist);
        Print_Rank(vPlist);
    
        return 0;
    }
  • 相关阅读:
    很漂亮的按钮css样式(没有用到图片,可直接拷贝代码使用)
    if、while中变量的作用域问题
    笔记
    搭建高可用mongodb集群(一)——配置mongodb
    Java编程:删除 List 元素的三种正确方法
    MySQL 数据类型
    MySQL 通用查询日志(General Query Log)
    mysql 创建一个用户,指定一个数据库
    MySQL 5.7 免安装版配置
    String,StringBuffer与StringBuilder的区别??
  • 原文地址:https://www.cnblogs.com/yuehouse/p/10091228.html
Copyright © 2011-2022 走看看