• C++的deque(双端队列),priority_queue(优先级队列)


    deque

    deque是一个容器,是双端队列,从功能上来讲,deque是一个vector和list的结合体

    顺序表和链表

    deque的结构和优缺点

    开辟buff小数组,空间不够了,不扩容,而是开辟一个新的小数组

    开辟中控数组(指针数组)指向buff小数组

    将已存在的数组指针存在中控数组中间,可以使用下标访问

    头插向前插,尾插向后插,相比于vector可以较高效率的进行头尾操作

    cur指向具体数据,node指向当前数组

    first指向数组开始,last指向数组结束

    遍历

    it == end()后,将it.指向node->first,即下一个buff数组的第一个数据

    deqeu的迭代器

    用两个迭代器指向第一个和最后一个buff的位置

    其余的buff可以通过+-来获得

    注意,头插是将数据插入新的开头的buff的尾部

    eg.

    缺点

    在buff小数组内插入删除数据,需要挪动数据,效率低于vector

    [ ]访问的效率也不高

    因此不能代替vector和list

    priority_queue

    优先级队列也是一个容器适配器

    他的底层是一个堆(二叉堆),需要大量使用 [ ] 访问

    优先级队列默认是大堆

    迭代器区间构造

    仿函数

    由于优先级队列默认是大堆

    如果想换成小堆,就要使用仿函数

    eg.

    仿函数就是函数对象:重载了operator()的类

    类的对象可以想函数一样使用

    eg.

    这里的f1() = f1.operator()

    即对象可以像函数一样使用

    自定义类型

    优先级队列需要用户在自定义类型中提供>和<的重载

    eg.

    日期类

    底层

    1. #pragma once
    2. #include
    3. template<class T>
    4. class myless
    5. {
    6. bool operator()(const T& x, const T& y)
    7. {
    8. return x < y;
    9. }
    10. };
    11. template<class T>
    12. class mygreater
    13. {
    14. bool operator()(const T& x, const T& y)
    15. {
    16. return x > y;
    17. }
    18. };
    19. namespace bit
    20. {
    21. template<class T, class Container = vector, class Compare >//分别是容器内存放的数据的类型,容器和用于比较的仿函数(默认是less)
    22. class priority_queue
    23. {
    24. public:
    25. //强制编译器生成默认构造
    26. priority_queue() = default;
    27. template<class InputIterator>
    28. priority_queue(InputIterator first, InputIterator last)//迭代器区间构造
    29. {
    30. while (first != last)
    31. {
    32. _con.push_back(*first);//所有数据放入(现在还不是堆)
    33. ++first;
    34. }
    35. //建堆
    36. for (int i = (_con.size() - 1 - 1) / 2; i < length; i++)//从倒数第一个非叶子节点开始建堆
    37. {
    38. adjust_down(i);
    39. }
    40. }
    41. void adjust_up(int child)//制造大堆
    42. {
    43. Compare comfunc;
    44. int parent = (child - 1) / 2;
    45. while (child > 0)
    46. {
    47. if (compfunc(_con[parent], _con[child]))
    48. {
    49. swap(_con[parent], _con[child]);
    50. child = parent;
    51. parent = (child - 1) / 2;
    52. }
    53. else
    54. {
    55. break;
    56. }
    57. }
    58. }
    59. void push(const T& x)
    60. {
    61. _con.push_back(x);
    62. adjust_up(_con.size() - 1);//向上调整
    63. }
    64. void adjust_down(int parent)
    65. {
    66. Compare compfunc
    67. int child = parent * 2 + 1;//左孩子
    68. while (child < _con.size())
    69. {
    70. if (child + 1 < _con.size() && _con.[child] < _con[child + 1])//假设左孩子大且右孩存在
    71. {
    72. ++child;
    73. }
    74. if (compfunc(_con[parent], _con[child]))
    75. {
    76. swap(_con[parent], _con[child]);
    77. parent = child;
    78. child = parent * 2 + 1;
    79. }
    80. else
    81. {
    82. break;
    83. }
    84. }
    85. }
    86. void pop()
    87. {
    88. swap(_con[0], _con[_con.size() - 1]);
    89. _con.pop_back();
    90. adjust_down(0);
    91. }
    92. const T& top()
    93. {
    94. return _con[0];
    95. }
    96. size_t size()
    97. {
    98. return _con.size();
    99. }
    100. bool empty()
    101. {
    102. return _con.empty();
    103. }
    104. private:
    105. Container _con;
    106. };
    107. }

  • 相关阅读:
    R可视化:给柱状图添加网格
    Hadoop分布式集群搭建,以及ssh互通免密登录!
    HashData获得华为鲲鹏Validated认证 信创版图持续壮大
    每日刷题Day8
    【JVM】JVM的垃圾回收机制与垃圾回收器的选择
    中国人造板行业现状调查分析与“十四五”战略规划研究报告2022-2028年版
    第5周学习:ShuffleNet & EfficientNet & 迁移学习
    (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
    Character.AI:产品优势和商业壁垒在哪里?
    【C语言刷LeetCode】1282. 用户分组(M)
  • 原文地址:https://blog.csdn.net/2301_80006788/article/details/139385524