美文网首页
黑马C++视频笔记《STL之deque容器》

黑马C++视频笔记《STL之deque容器》

作者: 井底蛙蛙呱呱呱 | 来源:发表于2021-01-21 00:10 被阅读0次
    deque
    deque内部工作原理
    /* deque容器
     * 双端数组,可以对头端和尾端进行插入操作.(链表式储存).
     *
     * deque与vector区别:
     *  - vector对于头部的插入效率低,数据量越大,效率越低;
     *  - deque相对而言,对头部的插入删除速度会比vector快;
     *  - vector访问元素时的速度会比deque快,这和两者内部实现有关.
     *
     * deque内部工作原理:
     *  deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据。中控器维护的是每个缓冲区的地址,
     *  使得使用deque时像一片连续的内存空间.
     *
     * deque构造函数:
     *  - `deque<T> deq;`,默认构造形式;
     *  - `deque(iterator_begin, iterator_end);`,构造函数将[iterator_begin, iterator_end)间的元素拷贝给本身;
     *  - `deque(n, elem);`,构造函数将n个elem拷贝给本身;
     *  - `deque(const deque &deq);`,拷贝构造函数.
     *
     * 赋值操作:
     *  - `deque(& operator=(const deque &deq);`, 重载等号操作符;
     *  - `assign(iterator_begin, iterator_end);`,将[iterator_begin, iterator_end)区间内的元素赋值给本身;
     *  - `assign(n, elem);`,将n个elem赋值给本身.
     *
     * 大小操作:
     *  - `deque.empty();`,判断容器是否为空;
     *  - `deque.size();`,返回容器中元素的个数;
     *  - `deque.resize(int num);`,重新指定容器的大小,变长则填充默认值,变短则删除多出来的末端值;
     *  - `deque.resize(int num, elem);`,重新指定容器的大小,变长则填充elem,变短则删除多出来的末端值;
     *
     * 插入删除操作:
     *  - `push_back(elem);`,在容器尾部添加一个数据;
     *  - `push_front(elem);`,在容器头部插入一个数据;
     *  - `pop_back();`,删除容器最后一个数据;
     *  - `pop_front();`,删除容器第一个数据;
     *  - `insert(iterator_pos, elem);`,在指定位置插入元素;
     *  - `insert(iterator_pos, n, elem);`,在指定位置插入n个元素;
     *  - `insert(iterator_pos, iterator_begin, iterator_end);`,在指定位置插入区间[begin, end)间的数据,无返回值;
     *  - `clear();`,清空容器的所有数据;
     *  - `erase(iterator_begin, iterator_end);`,删除[begin, end)区间的数据,【返回下一个数据的位置】;
     *  - `erase(iterator_pos);`,删除pos位置的数据,【返回下一个数据的位置】;
     *
     * 数据存取:
     *  - `at(int idx);`,返回索引idx所指的数据;
     *  - `operator[];`,返回索引idx所指的数据;
     *  - `front();`,返回容器中第一个数据元素;
     *  - `back();`,返回容器中最后一个数据元素.
     *
     * deque排序:
     *  - `sort(iterator begin, iterator end);`,对beg和end区间内的元素进行排序.
     *  vector也可用sort进行排序。
     *
     */
    

    实战案例

    #include <iostream>
    #include <string>
    #include <deque>
    #include <vector>
    #include <ctime>
    using namespace std;
    
    /* 实战案例:
     * 10个评委分别对5个选手打分,去除一个最高分一个最低分然后计算平均分.
     */
    
    class Person{
    public:
        Person(string name, int score){
            this->m_name = name;
            this->m_score = score;
        }
    
        string m_name;
        int m_score;
    };
    
    
    void CreatePerson(vector<Person> & v){
        string persons = "ABCDE";
        for (int i=0; i<5; i++){
            string name = "选手";
    
            name += persons[i];
            int score = 0;
            Person p(name, score);
            v.push_back(p);
            // 下面代码会报错,因为v[i]当前没有元素,因此不能索引赋值
            // v[i] = Person(name, score);
        }
    }
    
    
    void setScore(vector<Person> &v){
        for (vector<Person>::iterator it=v.begin();it!=v.end();it++){
            // 将评委得分放入到deque容器中
            deque<int> d;
            for (int i=0; i<10; i++){
                int score = rand()%41 +60;  // 60~100
                d.push_back(score);
            }
            // 排序取出最高分和最低分
            //deque<int>::iterator dt;
            sort(d.begin(),d.end());
            d.pop_front();
            d.pop_front();
    
            // 取平均分
            int sum=0;
            for (deque<int>::iterator it=d.begin();it!=d.end();it++){
                sum += *it;
            }
    
            int score = sum/d.size();
            it->m_score = score;
        }
    }
    
    int main(){
        srand((unsigned int)time(NULL));
        // 创建5名选手
        vector<Person> v;
        CreatePerson(v);
    
        for (vector<Person>::iterator it=v.begin();it!=v.end();it++){
            cout << it->m_name << " " << it->m_score << endl;
        }
    
        // 评委打分并计算平均分
        setScore(v);
        for (vector<Person>::iterator it=v.begin();it!=v.end();it++){
            cout << it->m_name << " " << it->m_score << endl;
        }
    }
    

    相关文章

      网友评论

          本文标题:黑马C++视频笔记《STL之deque容器》

          本文链接:https://www.haomeiwen.com/subject/azclzktx.html