STL(标准模板库)-deque容器

在这里插入图片描述

deque容器和vector容器最大的差异:

a、deque插入和删除 常数项时间(不会因为数据量的大小 改变操作所耗时)
b、deque容器没有容量的概念 以分段连续空间组成。
c、Deque是由一段一段的定量的连续空间构成。

在这里插入图片描述

1、deque容器的构造 和赋值

 deque构造函数
deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
deque赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
swap(deq);// 将deq与本身的元素互换

void printDequeInt(deque<int> &d)
{
    for(deque<int>::iterator it=d.begin();it!=d.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
void test01()
{
    deque<int> d(5,10);
    printDequeInt(d);//10 10 10 10 10

    //assign(n, elem);//将n个elem拷贝赋值给本身。
    deque<int>  d1;
    d1.assign(5,100);
    printDequeInt(d1);//100 100 100 100 100

    //deque& operator=(const deque &deq); //重载等号操作符
    deque<int>  d2;
    d2 = d1;
    printDequeInt(d2);//100 100 100 100 100

    //swap(deq);// 将deq与本身的元素互换
    deque<int> d3(5,1);
    deque<int> d4(5,2);
    printDequeInt(d3);//1 1 1 1 1
    printDequeInt(d4);//2 2 2 2 2
    d3.swap(d4);
    printDequeInt(d3);//2 2 2 2 2
    printDequeInt(d4);//1 1 1 1 1
}

运行结果:
在这里插入图片描述

2、deque容器的大小操作、双端插入删除操作、元素访问操作

 deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
 deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
 deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
front();//返回第一个数据。
back();//返回最后一个数据

void test02()
{
    deque<int> d;
    //尾部插入
    d.push_back(10);
    d.push_back(20);
    d.push_back(30);//10 20 30

    //头部插入
    d.push_front(40);
    d.push_front(50);
    d.push_front(60);
    printDequeInt(d);//60 50 40 10 20 30

    //头部删除
    d.pop_front();//50 40 10 20 30
    //尾部删除
    d.pop_back();//50 40 10 20
    printDequeInt(d);//50 40 10 20

    if(d.empty())
    {
        cout<<"d容器为空"<<endl;
    }
    else
    {
        cout<<"d容器非空"<<endl;
        cout<<"size = "<<d.size()<<endl;//4
    }

    //[]访问第二个元素
    cout<<"d[2] = "<<d[2]<<endl;//10
    cout<<"d.at(2) = "<<d.at(2)<<endl;//10
    cout<<"头元素 = "<<d.front()<<endl;//50
    cout<<"尾元素 = "<<d.back()<<endl;//20
}

运行结果:
在这里插入图片描述

3、容器的插入删除

 deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
 deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置


void test03()
{
    deque<int> d;
    d.insert(d.begin(),5, 100);
    printDequeInt(d);//100 100 100 100 100

    d.clear();
    cout<<"size = "<<d.size()<<endl;//0
}

运行结果:
在这里插入图片描述

4、案例:有5名选手:选手ABCDE,

10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分,最后输出每位选手的分数

步骤分析:
1. 创建五名选手,放到vector中
2. 遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容器中
3. sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分
4. deque容器遍历一遍,累加分数,累加分数/d.size()
5. person.score = 平均分

#include <iostream>
#include<string>
#include<vector>
#include<deque>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
using namespace std;

//选手类
class Person
{
public:
    string name;
    int score;
    Person(string name,int score)
    {
        this->name = name;
        this->score =score;
    }
};
void createPerson(vector<Person> &v)
{
    //5名选手是ABCDE
    string nameTmp="ABCDE";
    for(int i=0;i<5;i++)
    {
        string name="选手:";
        name += nameTmp[i];

        //将选手的姓名 分数0 放入vector容器中
        v.push_back(Person(name,0));
    }
}
void printVectorPerson(vector<Person> &v)
{
    for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
    {
        //*it == Person
        cout<<(*it).name<<" "<<(*it).score<<endl;
    }
}
void playGame(vector<Person> &v)
{
    //设置随机种子
    srand(time(NULL));

    //容器v中的每个人 逐一比赛
    for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
    {
        //*it == Person
        //每位选手 都要被10个评委打分 放入deque容器中
        deque<int> d;
        for(int i=0;i<10;i++)//10个评委
        {
            int score = rand()%41+60;//60~100
            d.push_back(score);
        }

        //对deque容器(评委的10个分数)排序
        sort(d.begin(), d.end());//去掉一个最低分 最高分

        //去掉一个最低分
        d.pop_front();
        //去掉一个最高分
        d.pop_back();

        //得到每个选手的总分数
        int sum = accumulate(d.begin(),d.end(), 0);

        //获取平均分 赋值 选手的score
        (*it).score = sum/d.size();
    }
}
int main(int argc, char *argv[])
{
    //1、定义一个vector容器存放5名选手
    vector<Person> v;
    createPerson(v);

    //2、5名选手 逐一比赛
    playGame(v);

    //3、将5名选手的成绩打印出来
    printVectorPerson(v);
    return 0;
}

运行结果:
在这里插入图片描述

5、srand设置随机种子 rand 产生随机数

#include <iostream>
#include<time.h>
using namespace std;

int main(int argc, char *argv[])
{
    //设置随机数种子time(NULL)获取当前时间
    srand(time(NULL));

    for(int i=0;i<10; i++)
    {
        //rand()函数的返回值就是随机数
        int num = rand();
        cout<<num<<" ";
    }
    cout<<endl;
    return 0;
}

运行结果:
在这里插入图片描述

发布了78 篇原创文章 · 获赞 45 · 访问量 9267

猜你喜欢

转载自blog.csdn.net/weixin_43288201/article/details/105234125