• c++中的deque容器和queue容器


    一、deque容器 双端动态数组

    在这里插入图片描述

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

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

    1、deque容器的构造和赋值

    #include 
    #include 
    
    using namespace std;
    
    
    /*
     * 1、deque构造函数
     * deque deqT;//默认构造形式
     * deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
     * deque(n, elem);//构造函数将n个elem拷贝给本身。
     * deque(const deque &deq);//拷贝构造函数。
     * 2、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
    
    }
    
    
    int main(int argc, char *argv[])
    {
       test01();
        return 0;
    }
    

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

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

    /*
    3.3.3.3 deque大小操作
    deque.size();//返回容器中元素的个数
    deque.empty();//判断容器是否为空
    deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
    如果容器变短,则末尾超出容器长度的元素被删除。
    6deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
    3.3.3.4 deque双端插入和删除操作
    push_back(elem);//在容器尾部添加一个数据
    push_front(elem);//在容器头部插入一个数据
    pop_back();//删除容器最后一个数据
    pop_front();//删除容器第一个数据
    3.3.3.5 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
    
    }
    
    
    int main(int argc, char *argv[])
    {
       test02();
        return 0;
    }
    

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

    3、容器的插入删除

    /* 
    3.3.3.6 deque插入操作 
    insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。 
    insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。 
    insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。 
    3.3.3.7 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 10017
        d.clear(); 
        cout<<"size = "<<d.size()<<endl;//0 
    } 
    

    运行结果:
    在这里插入图片描述
    案例:有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 
    #include
    #include
    #include 
    #include 
    #include
    
    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 name = "ABCDE";
        for(int i = 0; i < 5; i++){
            string str = "选手";
            str += name[i];
            //将选手的姓名 分数0 放入vector容器中
            v.push_back(Person(str,0));
        }
    }
    
    void aveScore(vector<Person> &v){
    
        //设置随机种子
        srand(time(NULL));
    
        //容器v中的每个人 逐一比赛
        for(vector<Person>::iterator it = v.begin(); it != v.end(); it++){
    
            //每位选手 都要被10个评委打分 放入deque容器中
            deque<int> d;
            //10个评委
            for(int i = 0; i < 10; i++){
                int score = rand()%41+60;//60~100
                d.push_back(score);
            }
    
            //对deque容器(评委的10个分数)排序
            sort(d.begin(), d.end());
    
            //去掉一个最低分 最高分
            d.pop_back();
            d.pop_front();
    
            //得到每个选手的总分数
            int sum = accumulate(d.begin(),d.end(),0);
            
            //获取平均分 赋值 选手的score
            (*it).score = sum/8;
        }
    }
    
    void printVectorPerson(vector<Person> &v) {
        for(vector<Person>::iterator it=v.begin();it!=v.end();it++) {
            //*it == Person
            cout<<(*it).name<<" "<<(*it).score<<endl;
        }
    }
    
    int main(int argc, char *argv[])
    {
        //1、定义一个vector容器存放5名选手
        vector<Person> v;
        createPerson(v);
        
        //2、5名选手逐一比赛求成绩平均分
        aveScore(v);
        
        //3、将5名选手的成绩打印出来
        printVectorPerson(v);
        return 0;
    }
    

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

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

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

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

    二、stack容器 栈容器

    先进后出的数据结构。
    push入栈、pop出栈、top永远指向栈顶元素
    stack没有迭代器
    在这里插入图片描述

    /*
    3.4.3.1 stack构造函数
    stack stkT;//stack采用模板类实现, stack对象的默认构造形式:
    stack(const stack &stk);//拷贝构造函数
    3.4.3.2 stack赋值操作
    stack& operator=(const stack &stk);//重载等号操作符
    3.4.3.3 stack数据存取操作
    push(elem);//向栈顶添加元素
    pop();//从栈顶移除第一个元素
    top();//返回栈顶元素
    3.4.3.4 stack大小操作
    empty();//判断堆栈是否为空
    size();//返回堆栈的大小
    */
    void test01()
    {
        stack<int> s;
        //入栈
        s.push(10);
        s.push(20);
        s.push(30);
        s.push(40);
    
        if(s.empty()) {
            cout<<"栈容器为空"<<endl;
        }
        else {
            cout<<"栈容器非空"<<endl;
            cout<<"size = "<<s.size()<<endl;
        }
    
        while(!s.empty()) {
            cout<<s.top()<<endl;
            //出栈
            s.pop();
        }
    }
    
    int main(int argc, char *argv[])
    {
        test01();
        return 0;
    }
    

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

    三、队列容器 queue

    队列容器:先进先出 队尾插入数据 对头删除数据
    queue容器:没有迭代器 不具备遍历功能 只能通过front、back访问
    在这里插入图片描述

    /*
    3.5.3.1 queue构造函数
    queue queT;//queue采用模板类实现,queue对象的默认构造形式:
    queue(const queue &que);//拷贝构造函数
    3.5.3.2 queue存取、插入和删除操作
    push(elem);//往队尾添加元素
    pop();//从队头移除第一个元素
    back();//返回最后一个元素
    front();//返回第一个元素
    3.5.3.3 queue赋值操作
    queue& operator=(const queue &que);//重载等号操作符
    3.5.3.4 queue大小操作
    empty();//判断队列是否为空
    size();//返回队列的大小
    */
    #include
    void test02() {
    
        queue<int> q;
        q.push(10);
        q.push(20);
        q.push(30);
        q.push(40);
    
        if(q.empty()) {
    
            cout<<"容器为空"<<endl;
        }
        else {
    
            cout<<"容器非空"<<endl;
            cout<<"size = "<<q.size()<<endl;
            cout<<"对头元素 = "<<q.front()<<endl;//10
            cout<<"队尾元素 = "<<q.back()<<endl;//40
        }
    
        cout<<"遍历队列"<<endl;
        while(!q.empty()) {
    
            cout<<q.front()<<" ";
            q.pop();//出队
        }
    }
    
    int main(int argc, char *argv[])
    {
        test02();
        return 0;
    }
    

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

  • 相关阅读:
    我理解的反射
    Golang中for循环使用
    面试如何准备Redis的问题(含缓存穿透,持久化和数据一致性等知识点)
    简单的CNN实现——MNIST手写数字识别
    深度解读《深度探索C++对象模型》之C++虚函数实现分析(二)
    Eclipse 主网即将上线迎空投预期,Zepoch 节点或成受益者?
    正点原子嵌入式linux驱动开发——U-boot移植
    48从零开始用Rust编写nginx,搭建一个简单又好看官方网站
    我们是如何解决偶发性的 502 错误的
    模拟电路设计(35)---几种脉宽调制型开关电路
  • 原文地址:https://blog.csdn.net/DUANJIAWEIDUANJIAWEI/article/details/127120189