首页 > 代码库 > STL deque

STL deque

deque 分块储存数据,双口分段式连续内存空间容器,无大小和容量概念

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<deque>
#include<vector>
#include<ctime>
#include<algorithm>
#include<string>
using namespace std;

void printDeque(const deque<int> &d){
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it){
        cout << *it << " ";
    }

    //deque<int>::reverse_iterator

    cout << endl;
}

//1. deque构造函数
/*
deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。

*/
void test01(){

    int arr[] = { 1, 2, 3, 4, 5, 6 };
    deque<int> d1(arr,arr+sizeof(arr)/sizeof(int));
    printDeque(d1);

    deque<int> d2(10, 6);
    printDeque(d2);

}

//2.deque赋值操作 
/*
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
swap(deq);// 将deq与本身的元素互换

*/
void test02(){

    int arr[] = { 1, 2, 3, 4, 5, 6 };
    deque<int> d1(arr, arr + sizeof(arr) / sizeof(int));
    printDeque(d1);

    deque<int> d2;
    d2.assign(d1.begin(),d1.end());
    d2.push_back(100);
    printDeque(d2);

    cout << "--------------" << endl;
    d1.swap(d2);
    printDeque(d1);
    printDeque(d2);
}

//3. deque大小操作
/*
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
*/
void test03(){
    
    deque<int> d;
    cout << d.size() << endl;

    if (d.empty()){
        cout << "空!" << endl;
    }

    d.resize(10, 7);
    printDeque(d);
}

//4. deque双端插入和删除操作
/*
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
*/
void test04(){

    deque<int> d;
    d.push_back(10);
    d.push_front(20);
    printDeque(d);
    d.pop_back();
    d.pop_front();
    cout << d.size() << endl;
}

//5. deque插入操作
/*
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
*/
void test05(){

    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_back(30);
    d.push_back(40);
    d.push_back(50);

    d.insert(d.begin() + 1,100);
    d.insert(d.begin() + 2, 2, 0);
    printDeque(d);

    deque<int> d2;
    d2.push_back(100);
    d2.push_back(200);
    d2.push_back(300);

    d2.insert(d2.begin() + 1, d.begin() + 1, d.end());
    printDeque(d2);

}

//6. deque删除操作
/*
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
*/
void test06(){

    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_back(30);
    d.push_back(40);
    d.push_back(50);

    d.erase(d.begin());
    d.erase(d.begin(), d.end()); //d.clear();

    cout << d.size() << endl;

}

//学生打分案例
//有5个学生,10个评委分别对这5个学生进行打分,去除最低分,去除最高分,取平均分

class Student{
public:
    string mName;
    int mScore;
};

//创建学生
void CreateStudents(vector<Student> &vec){
    
    string seedName = "ABCDE";
    for (int i = 0; i < 5;i ++){
        
        //创建学生
        Student stu;
        stu.mName = "学生";
        stu.mName += seedName[i];
        stu.mScore = 0;
        //保存学生信息
        vec.push_back(stu);
    }

}

//对每一个学生进行打分
void SetSocre(vector<Student> &vec){

    //种下种子
    srand((unsigned int)time(NULL));

    //遍历学生
    for (vector<Student>::iterator it = vec.begin(); it != vec.end(); ++it){
    
        //保存分数
        deque<int> dScore;
        for (int i = 0; i < 10;i ++){
            int score = rand() % 70 + 30;
            dScore.push_back(score);
        }

        //排序
        sort(dScore.begin(), dScore.end());
        //去除最高分,去除最低分
        dScore.pop_back();
        dScore.pop_front();
        //求总分
        int totalScore = 0;
        for (deque<int>::iterator sit = dScore.begin(); sit != dScore.end();++sit){
            totalScore += (*sit);
        }
        //求平均分
        int avgScore = totalScore / dScore.size();
        //保存当前学生分数
        it->mScore = avgScore;
    }

}
//给学生排序,并且输出
bool mycomapre(Student &s1,Student &s2){
    return s1.mScore > s2.mScore;
}
void ShowStudengsByScore(vector<Student> &vec){
    sort(vec.begin(), vec.end(), mycomapre);
    //学生成绩从大到小显示
    for (vector<Student>::iterator it = vec.begin(); it != vec.end(); ++it){
        cout << "Name:" << it->mName << " Score:" << it->mScore << endl;
    }
}

void test07(){

    vector<Student> vStus; //保存学生信息
    //1.创建学生
    CreateStudents(vStus);
    //2.评委给学生打分
    SetSocre(vStus);
    //3.根据成绩降序排列学生
    ShowStudengsByScore(vStus);
}

int main(){

    //test01();
    //test02();
    //test03();
    //test04();
    //test05();
    //test06();
    test07();

    system("pause");
    return EXIT_SUCCESS;
}

 

STL deque