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

 

posted @ 2018-12-09 14:59  悦悦的小屋  阅读(703)  评论(0编辑  收藏  举报