• deque容器使用及评委打分系统


    目录

    deque容器基本概念

     一、构造函数

    二、赋值操作

    三、大小操作

    四、插入和删除

    五、数据存取

    六、排序操作

    评委打分系统 


    deque容器基本概念

    功能:双端数组,头尾都能进行插入删除操作

    与vector的区别:

    1.vector对于头部的插入删除效率低,数据越多,效率越低

    2.deque对头部删除插入的速度快,效率高

    3.vector访问内部元素时的速度比deque快

    注:图片来自STL源码剖析

     这是一个双端队列,deque的内部实现很复杂,依靠中控器管理多个缓冲区

    依靠相当复杂的迭代器实现,我还没这个能力去实现

     一、构造函数

    打印函数

    1. void printDeque(deque<int>&d)//可用const_iterator限定只读
    2. {
    3. /*for (deque<int>::const_iterator i = d.begin(); i != d.end(); i++)
    4. cout << *i << " ";
    5. cout << endl;*/
    6. for (auto i : d)
    7. cout << i << " ";
    8. cout << endl;
    9. }

    auto可自动推导类型,用const_iterator可防止数据被修改 

    可采用无参构造,指定迭代器区间构造,指定个数的元素赋值,以及拷贝构造

    1. void test01()
    2. {
    3. deque<int>d1;
    4. for (int i = 0; i < 10; i++)
    5. d1.push_back(i);
    6. printDeque(d1);
    7. deque<int>d2(d1.begin(), d1.end());
    8. printDeque(d1);
    9. deque<int>d3(7, 3);
    10. printDeque(d1);
    11. deque<int>d4(d3);
    12. printDeque(d1);
    13. }

    二、赋值操作

    1. void test02()
    2. {
    3. deque<int>d1;
    4. for (int i = 0; i < 10; i++)
    5. d1.push_back(i);
    6. printDeque(d1);
    7. deque<int>d2;
    8. d2 = d1;
    9. printDeque(d2);
    10. deque<int>d3;
    11. d3.assign(d1.begin(), d1.end());
    12. printDeque(d3);
    13. deque<int>d4;
    14. d4.assign(7, 3);
    15. printDeque(d4);
    16. }

     赋值可采用重载=号运算符以及使用assign函数

    三、大小操作

    1. void test03()
    2. {
    3. deque<int>d1;
    4. for (int i = 0; i < 10; i++)
    5. d1.push_front(i);
    6. printDeque(d1);
    7. if (d1.empty())
    8. cout << "d1为空" << endl;
    9. else
    10. cout << "d1不为空,大小为" << d1.size() << endl;
    11. d1.resize(5);//缩小舍去多余元素
    12. printDeque(d1);
    13. d1.resize(15, 7);//扩大并初始化新开辟的空间
    14. printDeque(d1);
    15. }

    deque没有容量的概念,可以不断从两端开辟空间的。因此没有reserve预开辟空间,resize指定空间大小。

    四、插入和删除

    1. void test04()
    2. {
    3. deque<int>d1, d2;
    4. d1.push_back(10);
    5. d1.push_back(20);
    6. d1.push_front(10);
    7. d1.push_front(20);
    8. d2 = d1;
    9. printDeque(d1);
    10. d1.pop_back();
    11. d1.pop_front();
    12. printDeque(d1);
    13. d2.insert(d2.begin(), 2333);
    14. printDeque(d2);
    15. d2.insert(d2.begin(), 3, 7);
    16. printDeque(d2);
    17. deque<int>d3;
    18. d3.push_back(1);
    19. d3.push_back(2);
    20. d3.push_back(3);
    21. d2.insert(d2.begin(),d3.begin(), d3.end());
    22. printDeque(d2);
    23. d2.erase(d2.begin()+1);
    24. printDeque(d2);
    25. d2.erase(d2.begin(), d2.end()-1);
    26. printDeque(d2);
    27. d2.clear();
    28. printDeque(d2);
    29. }

     deque可以头插尾插,也可以头删尾删,insert插入有三种

    1、向指定位置插入一个数据

    2、向指定位置插入n个数据

    3、将某一deque对象的某一区间数据插入到该deque对象的某一位置后面

    此外erase删除函数,删除单个或指定区间的数据

    clear函数清空所有数据

    五、数据存取

    1. void test05()
    2. {
    3. deque<int>d;
    4. d.push_back(1);
    5. d.push_back(2);
    6. d.push_back(3);
    7. d.push_front(1);
    8. d.push_front(2);
    9. d.push_front(3);
    10. for (int i = 0; i < d.size(); i++)
    11. cout << d[i] << " ";
    12. cout << endl;
    13. for (int i = 0; i < d.size(); i++)
    14. cout << d.at(i) << " ";
    15. cout << endl;
    16. d.pop_back();
    17. cout << d.front() << endl;
    18. cout << d.back() << endl;
    19. }

    重载[],使用at方法访问deque容器存储的数据 

    六、排序操作

    1. void test06()
    2. {
    3. deque<int>d;
    4. d.push_back(1);
    5. d.push_back(10);
    6. d.push_back(100);
    7. d.push_front(1000);
    8. d.push_front(500);
    9. d.push_front(250);
    10. printDeque(d);
    11. //对支持随机访问的迭代器都可用sort函数进行排序
    12. sort(d.begin(), d.end());
    13. printDeque(d);
    14. }

    对支持随机访问的迭代器都可用sort函数进行排序,sorth函数需要引用头文件algorithm

    sort默认从小到大排序,可以使用重载版本,传入第三个参数——自定义比较函数的地址,即函数名,设置排序依据。

    评委打分系统 

    目的功能:有5名选手ABCDE,有10名评委对其打分,去掉一个最高分和一个最低分,再取平均分作为其成绩。

    1. #include<iostream>
    2. #include<deque>
    3. #include<vector>
    4. #include<algorithm>//sort排序算法
    5. #include<string>
    6. #include<time.h>//生成随机成绩,设置时间戳
    7. #include<iomanip>//设置打印格式
    8. using namespace std;
    9. class Participant//创建参赛者类
    10. {
    11. string m_name;
    12. double m_grade;
    13. public:
    14. Participant(string name, double grade=0)//将成绩初始化为0
    15. {
    16. this->m_grade = grade;
    17. this->m_name = name;
    18. }
    19. void setScore(double grade)
    20. {
    21. this->m_grade = grade;
    22. }
    23. double getSore()
    24. {
    25. return this->m_grade;
    26. }
    27. string getName()
    28. {
    29. return this->m_name;
    30. }
    31. };
    32. void setParticipant(vector <Participant>&v)//设置参赛者名字
    33. {
    34. string t_name = "ABCDE";
    35. for (int i = 0; i < 5; i++)
    36. {
    37. string name = "选手";
    38. name += t_name[i];
    39. Participant p(name);
    40. v.push_back(p);
    41. }
    42. }
    43. void printList(vector<Participant>&v)//打印
    44. {
    45. for (auto i : v)
    46. cout << "姓名:" << i.getName() << "\t成绩:" << fixed << setprecision(2) << i.getSore()<<endl;//设置打印格式,保留两位小数
    47. }
    48. int main()
    49. {
    50. srand((unsigned int)time(NULL));//时间戳,设置有效随机数
    51. vector<Participant>v;
    52. setParticipant(v);
    53. for (vector<Participant>::iterator i=v.begin();i!=v.end();i++)
    54. {
    55. deque<double>d;//创建deque
    56. double sum = 0;
    57. for (size_t i = 0; i <10; i++)
    58. d.push_back(rand() % 41 + 60);//用deque存入随机成绩(60~100)
    59. sort(d.begin(), d.end());//排序
    60. d.pop_back();//去掉最高分
    61. d.pop_front();//去掉最低分
    62. for (size_t i = 0; i < d.size(); i++)
    63. sum += d[i];
    64. i->setScore(sum /d.size());//传入平均成绩
    65. }
    66. printList(v);
    67. return 0;
    68. }

     

    不同容器适用于不同要求和目的。

  • 相关阅读:
    LLM项目代码改写
    Java:如何去优雅地优化接口
    Run multiple services in a container
    一比一还原axios源码(五)—— 拦截器
    Cython 笔记 (Python/Jython)
    LeetCode 每日一题 2022/8/1-2022/8/7
    【Leetcode】163.缺失的区间
    并查集&LRUCache
    在线流程图和思维导图开发技术详解(五)
    QML使用C++model(撤销恢复)
  • 原文地址:https://blog.csdn.net/qwer1234mnbv_/article/details/125529403