• C++ STL进阶与补充(deque容器)


    1、deque构造函数

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

    Deque与vector的区别:

    1、vector对于头部的插入和删除效率低,数据量越大,效率越低。

    2、deque相对而言,头部操作更快。

    3、vector访问元素的速度波deque快。

    https://img-blog.csdnimg.cn/b69084adc27545eaa839c00346d2af28.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyI5YWJ5pmS5LqG5b6I5YeJ5b-r,size_14,color_FFFFFF,t_70,g_se,x_16

    Deque内部有一个中控器,维护每段缓冲区中的内容,缓冲区中存放真实的数据。中控器维护的是每个缓冲区的地址,使得使用deque时就像是一片连续的内存空间。

    https://img-blog.csdnimg.cn/3148f648f25d4769b6cefbd23e231292.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyI5YWJ5pmS5LqG5b6I5YeJ5b-r,size_14,color_FFFFFF,t_70,g_se,x_16

    Deque<T> deq;

    默认构造

    Deque(beg,end);

    构造函数将[beg,end]区间的元素拷贝给本身

    Deque(n,elem);

    构造函数将n个elem拷贝给本身

    Deque(const deque& deq);

    拷贝构造函数

    1. #include<iostream>
    2. #include<deque>
    3. using namespace std;
    4. void printDeque(const deque<int>& d)
    5. {
    6. //声明一个只读的迭代器
    7. for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    8. {
    9. cout << *it << " ";
    10. }
    11. cout << endl;
    12. }
    13. void test01()
    14. {
    15. deque<int> d1;
    16. for (int i = 0; i < 10; i++)
    17. {
    18. d1.push_back(i);
    19. }
    20. printDeque(d1);
    21. }
    22. int main()
    23. {
    24. test01();
    25. }

    2、deque赋值操作

    =

    使用等号赋值

    Assign(beg,end)

    将[beg,end]区间中的数据拷贝赋值给本身

    Assign(n,elem)

    将n个elem拷贝赋值给本身

    3、deque大小操作

    Deque.empty();

    判断容器是否为空

    Deque.size();

    返回容器中元素的个数(与vector不同,deque没有容量)

    Deque.resize(num);

    重新指定容器的长度为num,若容器变长,则以默认值填充新位置;若容器变短,则末尾超出容器长度的元素被删除。

    Deque.resize(num,elem);

    重新指定容器的长度为num,若容器变长,则以elem填充新位置;若容器变短,则末尾超出容器长度的元素被删除。

    1. #include<iostream>
    2. #include<deque>
    3. using namespace std;
    4. void printDeque(const deque<int>& d)
    5. {
    6. //声明一个只读的迭代器
    7. for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    8. {
    9. cout << *it << " ";
    10. }
    11. cout << endl;
    12. }
    13. void test01()
    14. {
    15. deque<int> d1;
    16. for (int i = 0; i < 10; i++)
    17. {
    18. d1.push_back(i);
    19. }
    20. printDeque(d1);
    21. if (d1.empty())
    22. {
    23. cout << "d1为空!" << endl;
    24. }
    25. else
    26. {
    27. cout << "d1不为空!" << endl;
    28. cout << "d1的大小为:" << d1.size() << endl;
    29. //deque没有容量的概念
    30. }
    31. d1.resize(15);
    32. printDeque(d1);
    33. d1.resize(15,1);
    34. printDeque(d1);
    35. d1.resize(5);
    36. printDeque(d1);
    37. }
    38. int main()
    39. {
    40. test01();
    41. }

    4、deque插入和删除

    Push_back(elem);

    在容器尾部添加一个数据

    Push_front(elem);

    在容器头部添加一个数据

    Pop_back();

    删除容器中最后一个元素

    Pop_front();

    删除容器第一个元素

    Insert(pos,elem);

    在pos位置插入一个elem,返回新数据的位置,位置要用迭代器表示

    Insert(pos,n,elem);

    在pos位置插入n个elem,无返回值

    Insert(pos,beg,end);

    在pos位置插入[beg,end]区间的数据,无返回值

    Clear();

    清空容器的所有数据

    Erase(beg,end);

    删除[beg,end]区间的数据,返回下一个数据的位置

    Erase(pos);

    删除pos未知的数据,返回下一个数据的位置

    1. #include<iostream>
    2. #include<deque>
    3. using namespace std;
    4. void printDeque(const deque<int>& d)
    5. {
    6. //声明一个只读的迭代器
    7. for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    8. {
    9. cout << *it << " ";
    10. }
    11. cout << endl;
    12. }
    13. void test01()
    14. {
    15. deque<int> d1;
    16. //尾插
    17. d1.push_back(1);
    18. d1.push_back(2);
    19. //头插
    20. d1.push_front(3);
    21. d1.push_front(4);
    22. printDeque(d1);
    23. //尾删
    24. d1.pop_back();
    25. printDeque(d1);
    26. //头删
    27. d1.pop_front();
    28. printDeque(d1);
    29. }
    30. void test02()
    31. {
    32. deque<int> d1;
    33. d1.push_back(1);
    34. d1.push_back(2);
    35. d1.push_front(3);
    36. d1.push_front(4);
    37. printDeque(d1); // 4 3 1 2
    38. //insert插入
    39. d1.insert(d1.begin(), 1000);
    40. printDeque(d1); //1000 4 3 1 2
    41. d1.insert(d1.begin(), 2, 100);
    42. printDeque(d1); //100 100 1000 4 3 1 2
    43. //按照区间插入
    44. deque<int> d2;
    45. d2.push_back(1);
    46. d2.push_back(2);
    47. d2.push_back(3);
    48. d1.insert(d1.begin(), d2.begin(), d2.end());
    49. printDeque(d1); //1 2 3 100 100 1000 4 3 1 2
    50. }
    51. void test03()
    52. {
    53. deque<int> d1;
    54. d1.push_back(1);
    55. d1.push_back(2);
    56. d1.push_front(3);
    57. d1.push_front(4);
    58. //删除
    59. deque<int>::iterator it = d1.begin();
    60. it++;
    61. d1.erase(it);
    62. printDeque(d1);//4 1 2
    63. }
    64. int main()
    65. {
    66. //test01();
    67. //test02();
    68. test03();
    69. }

    5、deque数据存取

    At(int idx)

    返回索引idx所指的数据

    []

    中括号

    Front()

    返回容器中第一个元素

    Back()

    返回容器中最后一个元素

    6、deque排序操作

    #include<algorithm> //需要包含头文件

    Sort(iterator beg, iterator end); //对beg和end区间内的元素进行排序

    Sort默认升序排列,

  • 相关阅读:
    三菱电子推出16W GaN PA,用于大规模MIMO
    ElasticSearch (ES)学习之路(二)Win10安装ES,可视化界面,Kibanna
    Mybatis-plus 使用
    Zookeeper集群 + Kafka集群
    Vue中Vue router和axios的封装使用。
    使用SpringBoot集成Mybatis的详细步骤
    pyqt5_windows_hid_auto_detect_hotplug
    《QT从基础到进阶·三十六》QWidget实现收缩栏的效果
    自动驾驶不等于无人驾驶,无人驾驶的概念是什么
    jar启动指定JDK/JRE 安装路径教程
  • 原文地址:https://blog.csdn.net/Lao_tan/article/details/125468305