• C++笔记 16 (STL常用容器 - deque)


    三. STL常用容器

    3.deque容器

    3.1 deque容器基本概念

    双端数组,可以对头端进行插入删除操作。

    deque和vector区别:
    1)vector对于头部的插入删除效率低,数据量越大,效率越低;
    2)deque相对而言,对头部的插入删除速度会比vector快;
    3)vector访问元素时的速度会比deque快。

    deque是list和vector的折中方案;

    deque内部工作原理:
    deque内部有个中控器,中控器维护的是每个缓冲区的地址,而缓冲区中存放真实的数据。

    deque容器的迭代器也支持随机访问的

    3.2 deque构造函数
    /*操作与vector相同*/
    deque<int>d1;
    deque<int>d2(di.begin(),d1.end());
    deque<int>d3(10,100);  //10个100
    deque<int>d4=d3;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.3 deque赋值操作
    /*操作与vector相同*/
    d2=d1;
    d3.assign(d1.begin(),d1.end());
    d4.assign(10,100);
    
    • 1
    • 2
    • 3
    • 4
    3.4 deque大小操作

    注意,区别于vector,deque没有容量的概念

    deque.empty(); //判断容器是否为空
    deque.size();//返回容器中元素的个数
    deque.resize(num);
    deque.resize(num,elem);
    
    • 1
    • 2
    • 3
    • 4
    3.4 deque插入和删除
    d.push_banck(10);  //尾插
    d.push_front(100); //头插
    d.pop_back();      //尾删
    d.pop_front();     //头删
    d.insert(d.begin(),1000);  //插入,返回新数据的位置
    d.insert(d.begin(),2,1000);  //无返回值
    d.insert(d.begin(),d2.begin(),d2.end());  /*无返回值,
    				在位置d.begin()插入[d2.begin(),d2.end()]区间的数据*/
    				
    d.erase(d.begin()); //删除d.begin()位置的数据。返回下一个数据的位置
    d.erase(d.begin().d.end()); //删除区间中数据,返回下一数据位置
    d.clear();         //清空
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    3.6 deque数据存取
    d[i];    //支持随机访问
    d.at[i]; //支持随机访问
    d.front();  //返回容器中第一个数据元素
    d.back();  //返回容器中最后一个数据元素
    
    • 1
    • 2
    • 3
    • 4
    3.7 deque排序
    sort(d.begin(),d.end()); //对区间内元素进行排序
    //使用时包含头文件algorithm  (默认从小到大)
    
    • 1
    • 2

    4. 案例-评委打分

    4.1 描述

    有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。

    4.2 实现步骤

    1)创建5名选手,放到vector容器中
    2)遍历vector容器,取出来每一个选手,执行for循环,可以把10个评委打分存到deque容器中
    3)sort算法对deque容器中分数排序,去除最高和最低分
    4)deque容器遍历一遍,累加总分
    5)获取平均分

    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    
    /*
    要求:
     有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。*/
    
    /*
    实现步骤:
            1. 创建五名选手,放到vector中 
    		2. 遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容器中
            3. sort算法对deque容器中分数排序,去除最高和最低分
            4. deque容器遍历一遍,累加总分
            5. 获取平均分                                                                         */
    
    class Person //选手类
    {  
    public:
    	Person(string name, int score) 
    	{
    		this->m_Name = name;
    		this->m_Score = score;
    	}
    	string m_Name;
    	int m_Score;
    };
    
    void creatPerson(vector<Person>& v) //创建5名选手  
    /* 此处注意是引用。  如果需要形参和实参对应修改,则要使用引用 */
    {
    	string nameseed = "ABCDE";
    	for (int i = 0; i < 5; i++) 
    	{
    		string name = "选手";
    		name += nameseed[i];
    		int score = 0;
    
    		Person p(name, score);
    
    		//将创建的Person对象放入容器中
    		v.push_back(p);
    	}
    }
    
    void setPerson(vector<Person> &v)   //给5名选手打分
    {
    	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;
    			d.push_back(score);
    		}
    		//排序
    		sort(d.begin(), d.end());
    
    		//去除最高分和最低分
    		d.pop_front();
    		d.pop_back();
    
    		//取平均分
    		int sum = 0;
    		for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++) {
    			sum += *dit;//累加每个评委的分数
    		}
    		int average = sum / d.size();
    
    		it->m_Score = average;//将平均分赋值到选手身上
    	}
    }
    
    void showScore(vector<Person>& v) //显示分数
    {
    	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << "姓名:" << it->m_Name << "   " << "平均分:" << it->m_Score << endl;
    	}
    }
    
    
    int main()
    {
    	srand((unsigned int)time(NULL));//随机数种子
    
    	//1.创建5名选手
    	vector<Person> v1;
    	creatPerson(v1);
    
    	//测试 遍历容器
        //for (vector::iterator it = v1.begin(); it != v1.end(); it++) {
    
    	//	cout << "姓名:" << (*it).m_Name <<"    "<< "分数:" << (*it).m_Score << endl;
    	//}
    
    	//2.给5名选手打分
    	setPerson(v1);
    
    
    	//3.显示成绩
    	showScore(v1);
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
  • 相关阅读:
    【Linux】基本的指令(三)
    随机数生成过慢导致系统阻塞怎么办?
    设备指纹技术详解丨设备指纹知多少,看这场直播就够了!
    如何成功地将 OKR 推广到您的组织
    Java的三个接口Comparable,Comparator,Cloneable(浅拷贝与深拷贝)
    dreamweaver作业静态HTML网页设计 大学美食菜谱网页制作教程(web前端网页制作课作业)
    Python这些冷门特性,当初也没教啊
    PMP项目整合管理
    【JavaEE初阶】多线程 _ 基础篇 _ 线程安全问题(下篇)
    JMM(Java Memory Model,Java内存模型)
  • 原文地址:https://blog.csdn.net/pangyushuang/article/details/127714745