• C++ 学习(18)STL - deque容器、stack容器、queue容器


    1、deque容器

    deque容器为双端数组,可以对头端和尾端进行插入删除操作。

    deque与vector区别:

    从两者内部实现比较:

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

    简单理解:vector读数据快,deque写数据快。

    deque内部工作原理:

    deque内部有个中控器,维护每段缓冲区,缓冲区中存放真实数据;中控器维护的是每个缓冲区的地址,使得使用deque时像一年连续的内存空间。如下图所示:

    1.1、deque构造函数

    函数原型:

    • deque deqT;        //默认构造形式
    • deque(beg, end);      //构造函数将[beg, end)区间中的元素拷贝给当前deque
    • deque(n, elem);        //构造函数将n个elem拷贝给当前deque
    • deque(const deque& deq); //拷贝构造函数
    1. #include
    2. #include
    3. using namespace std;
    4. void print(const deque<int>& d)
    5. {
    6. for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. int main()
    13. {
    14. // STL - deque - 构造函数
    15. /*函数原型:
    16. 1、deque deqT;        //默认构造形式
    17. 2、deque(beg, end);      //构造函数将[beg, end)区间中的元素拷贝给当前deque
    18. 3、deque(n, elem);        //构造函数将n个elem拷贝给当前deque
    19. 4、deque(const deque& deq); //拷贝构造函数
    20. */
    21. //1、deque deqT;
    22. deque<int> d1;
    23. for (int i = 0; i < 5; i++)
    24. {
    25. d1.push_back(i + 1);
    26. }
    27. print(d1);
    28. //2、deque(beg, end);
    29. deque<int> d2(d1.begin(), d1.end());
    30. print(d2);
    31. //3、deque(n, elem);
    32. deque<int> d3(5, 8);
    33. print(d3);
    34. //4、deque(const deque& deq);
    35. deque<int> d4(d1);
    36. print(d4);
    37. system("pause");
    38. return 0;
    39. }

    输出结果

    1 2 3 4 5
    1 2 3 4 5
    8 8 8 8 8
    1 2 3 4 5 

    1.2、deque赋值操作

    函数原型:

    • deque& operator=(const deque& deq);  //重载运算符=
    • assign(beg, end);   //将[beg, end)区间中的数据拷贝给当前deque
    • assign(n, elem);     //将n个elem拷贝赋值给本身
    1. #include
    2. #include
    3. using namespace std;
    4. void print(const deque<int>& d)
    5. {
    6. for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. int main()
    13. {
    14. // STL - deque - 赋值操作
    15. /*函数原型:
    16. 1、deque& operator=(const deque& deq);  //重载运算符=
    17. 2、assign(beg, end);   //将[beg, end)区间中的数据拷贝给当前deque
    18. 3、assign(n, elem);     //将n个elem拷贝赋值给本身
    19. */
    20. deque<int> d;
    21. for (int i = 0; i < 5; i++)
    22. {
    23. d.push_front(i + 1);
    24. }
    25. print(d);
    26. //1、deque& operator=(const deque& deq);
    27. deque<int> d1;
    28. d1 = d;
    29. print(d1);
    30. //2、assign(beg, end); 
    31. deque<int>::iterator it = d1.begin();
    32. it++;
    33. deque<int> d2;
    34. d2.assign(it, d1.end());
    35. print(d2);
    36. //3、assign(n, elem);
    37. deque<int> d3;
    38. d3.assign(5, 8);
    39. print(d3);
    40. system("pause");
    41. return 0;
    42. }

    输出结果

    5 4 3 2 1

    5 4 3 2 1
    4 3 2 1
    8 8 8 8 8

    1.3、deque大小操作

    函数原型:

    • deque.empty();          //判断容器是否为空
    • deque.size();             //返回容器中元素个数
    • deque.resize(num);  //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
    • deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
    1. #include
    2. #include
    3. using namespace std;
    4. void print(const deque<int>& d)
    5. {
    6. for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. int main()
    13. {
    14. // STL - deque - 大小操作
    15. /*函数原型:
    16. 1、deque.empty();          //判断容器是否为空
    17. 2、deque.size();            //返回容器中元素个数
    18. 3、deque.resize(num);  //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
    19. 4、deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
    20. */
    21. deque<int> d;
    22. //1、deque.empty(); 
    23. cout << "1、容器是否为空:" << (d.empty() ? "是" : "否") << endl;
    24. for (int i = 0; i < 5; i++)
    25. {
    26. d.push_front(i + 1);
    27. }
    28. cout << "1、容器初始化元素:";
    29. print(d);
    30. cout << "1、容器是否为空:" << (d.empty() ? "是" : "否") << endl;
    31. //2、deque.size();
    32. cout << "2、容器中元素个数:" << d.size() << endl;
    33. //3、deque.resize(num);
    34. d.resize(8);
    35. cout << "3、容器长度变长后大小:" << d.size() << ",元素:";
    36. print(d);
    37. d.resize(3);
    38. cout << "3、容器长度变短后大小:" << d.size() << ",元素:";
    39. print(d);
    40. //4、deque.resize(num, elem);
    41. d.resize(9, 10);
    42. cout << "4、容器长度变长后大小:" << d.size() << ",元素:";
    43. print(d);
    44. d.resize(5, 6);
    45. cout << "4、容器长度变短后大小:" << d.size() << ",元素:";
    46. print(d);
    47. system("pause");
    48. return 0;
    49. }

    输出结果

    1、容器是否为空:是
    1、容器初始化元素:5 4 3 2 1
    1、容器是否为空:否
    2、容器中元素个数:5
    3、容器长度变长后大小:8,元素:5 4 3 2 1 0 0 0
    3、容器长度变短后大小:3,元素:5 4 3
    4、容器长度变长后大小:9,元素:5 4 3 10 10 10 10 10 10
    4、容器长度变短后大小:5,元素:5 4 3 10 10

    1.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)区间的数据,无返回值
    • erase(pos);                //删除pos位置的数据,返回下一个数据的位置
    • erase(beg, end);        //删除[beg, end)区间的数据,返回下一个数据的位置
    • clear();                        //清空容器中所有数据
    1. #include
    2. #include
    3. using namespace std;
    4. void print(const deque<int>& d)
    5. {
    6. for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. int main()
    13. {
    14. // STL - deque - 插入和删除
    15. /*函数原型:
    16. 两端操作:
    17. 1、push_back(elem);    //在容器尾部添加一个数据
    18. 2、push_front(elem);    //在容器头部插入一个数据
    19. 3、pop_back();          //删除容器最后一个数据
    20. 4、pop_front();         //删除容器第一个数据
    21. 指定位置操作:
    22. 5、insert(pos, elem);     //在pos位置插入一个elem元素的拷贝,返回新数据的位置
    23. 6、insert(pos, n, elem);  //在pos位置插入n个elem数据,无返回值
    24. 7、insert(pos, beg, end); //在pos位置插入[beg, end)区间的数据,无返回值
    25. 8、erase(pos);            //删除pos位置的数据,返回下一个数据的位置
    26. 9、erase(beg, end);      //删除[beg, end)区间的数据,返回下一个数据的位置
    27. 10、clear();              //清空容器中所有数据
    28. */
    29. deque<int> d;
    30. //1、push_back(elem);
    31. for (int i = 0; i < 3; i++)
    32. {
    33. d.push_back(i + 1);
    34. }
    35. cout << "1、尾部添加3个数据,当前元素:";
    36. print(d);
    37. //2、push_front(elem); 
    38. for (int i = 10; i < 15; i++)
    39. {
    40. d.push_front(i + 1);
    41. }
    42. cout << "2、头部插入5个数据,当前元素:";
    43. print(d);
    44. //3、pop_back(); 
    45. d.pop_back();
    46. cout << "3、尾部删除1个数据,当前元素:";
    47. print(d);
    48. //4、pop_front(); 
    49. d.pop_front();
    50. cout << "4、头部删除1个数据,当前元素:";
    51. print(d);
    52. //5、insert(pos, elem); 
    53. deque<int>::iterator pos = d.insert(d.begin(), 99);
    54. cout << "5、在第1位置添加数据,当前元素:";
    55. print(d);
    56. //6、insert(pos, n, elem);
    57. d.insert(pos, 3, 88);
    58. cout << "6、在第1位置添加数据,当前元素:";
    59. print(d);
    60. //7、insert(pos, beg, end)
    61. deque<int> d2;
    62. d2.push_back(1);
    63. d2.push_back(2);
    64. pos = d.insert(d.begin(), d2.begin(), d2.end());
    65. cout << "7、在第1位置添加数据,当前元素:";
    66. print(d);
    67. //8、erase(pos); 
    68. d.erase(pos);
    69. cout << "8、删除第1位置数据,当前元素:";
    70. print(d);
    71. //9、erase(beg, end); 
    72. pos = d.begin();
    73. pos++;
    74. d.erase(pos, d.end());
    75. cout << "9、删除第2位置至尾区间数据,当前元素:";
    76. print(d);
    77. //10、clear(); 
    78. d.clear();
    79. cout << "10、清空数据,容器大小:" << d.size() << ",当前元素:";
    80. print(d);
    81. system("pause");
    82. return 0;
    83. }

    输出结果

    1、尾部添加3个数据,当前元素:1 2 3
    2、头部插入5个数据,当前元素:15 14 13 12 11 1 2 3
    3、尾部删除1个数据,当前元素:15 14 13 12 11 1 2
    4、头部删除1个数据,当前元素:14 13 12 11 1 2
    5、在第1位置添加数据,当前元素:99 14 13 12 11 1 2
    6、在第1位置添加数据,当前元素:88 88 88 99 14 13 12 11 1 2
    7、在第1位置添加数据,当前元素:1 2 88 88 88 99 14 13 12 11 1 2
    8、删除第1位置数据,当前元素:2 88 88 88 99 14 13 12 11 1 2
    9、删除第2位置至尾区间数据,当前元素:2
    10、清空数据,容器大小:0,当前元素:

    1.5、deque数据读取

    函数原型:

    • at(int idx);   //返回索引idx所指的数据
    • operator[];  //返回索引idx所指的数据
    • front();       //返回容器中第一个数据元素
    • back();      //返回容器中最后一个数据元素
    1. #include
    2. #include
    3. using namespace std;
    4. void print(const deque<int>& d)
    5. {
    6. for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. int main()
    13. {
    14. // STL - deque - 数据读取
    15. /*函数原型:
    16. 1、at(int idx);   //返回索引idx所指的数据
    17. 2、operator[];  //返回索引idx所指的数据
    18. 3、front();       //返回容器中第一个数据元素
    19. 4、back();      //返回容器中最后一个数据元素
    20. */
    21. deque<int> d;
    22. for (int i = 0; i < 5; i++)
    23. {
    24. d.push_back(i + 1);
    25. }
    26. cout << "容器中的元素:";
    27. print(d);
    28. //1、at(int idx);
    29. cout << "1、读取第3个元素:" << d.at(2) << endl;
    30. //2、operator[];
    31. cout << "2、读取第2个元素:" << d[1] << endl;
    32. //3、front(); 
    33. cout << "3、读取第一个元素:" << d.front() << endl;
    34. //4、back(); 
    35. cout << "4、读取最后一个元素:" << d.back() << endl;
    36. system("pause");
    37. return 0;
    38. }

    输出结果

    容器中的元素:1 2 3 4 5
    1、读取第3个元素:3
    2、读取第2个元素:2
    3、读取第一个元素:1
    4、读取最后一个元素:5

    1.6、deque排序

    算法:

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

    默认升序排序,对于支持随机访问的迭代器的容器(如vector, deque),都可以使用sort进行排序。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(const deque<int>& d)
    6. {
    7. for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
    8. {
    9. cout << *it << " ";
    10. }
    11. cout << endl;
    12. }
    13. int main()
    14. {
    15. // STL - deque - 排序
    16. /*算法:
    17. sort(iterator beg, iterator end);  //对beg和end区间内元素进行排序
    18. */
    19. deque<int> d;
    20. d.push_back(33);
    21. d.push_back(26);
    22. d.push_back(75);
    23. d.push_back(18);
    24. d.push_back(89);
    25. cout << "容器中的元素:";
    26. print(d);
    27. //排序 - 默认升序排序
    28. sort(d.begin(), d.end());
    29. cout << "排序后,容器中的元素:";
    30. print(d);
    31. system("pause");
    32. return 0;
    33. }

    输出结果

    容器中的元素:33 26 75 18 89
    排序后,容器中的元素:18 26 33 75 89

    2、stack容器

    stack是一种先进后出(First In Last Out, FILO)的数据结构,它只有一个出囗,且入囗与出囗共用一个。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。栈可以为空,也可以返回栈中的元素个数。栈中进入数据称为入栈(push),弹出数据称为出栈(pop),如下图所示:

    2.1、stack常用接囗

    函数原型:

    构造函数

    • stack stk;                    //stack采用模板类实现,stack对象的默认构造形式
    • stack(const stack& stk);   //拷贝构造函数

    赋值操作

    • stack& operator=(const stack& stk);  //重载运算符=

    数据存取

    • push(elem); //向栈顶添加元素
    • pop();          //从栈顶移除第一个元素
    • top();           //返回栈顶元素

    大小操作

    • empty();  //判断堆栈是否为空
    • size();     //返回栈大小
    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // STL - stack - 常用接囗
    7. /*函数原型:
    8. 构造函数
    9. 1、stack stk;              //stack采用模板类实现,stack对象的默认构造形式
    10. 2、stack(const stack& stk);   //拷贝构造函数
    11. 赋值操作
    12. 3、stack& operator=(const stack& stk);  //重载运算符=
    13. 数据存取
    14. 4、push(elem); //向栈顶添加元素
    15. 5、pop();      //从栈顶移除第一个元素
    16. 6、top();      //返回栈顶元素
    17. 大小操作
    18. 7、empty();  //判断堆栈是否为空
    19. 8、size();   //返回栈大小
    20. */
    21. //1、stack stk; 
    22. stack<int> s1;
    23. //7、empty();  //判断堆栈是否为空
    24. cout << "7、栈是否为空:" << (s1.empty() ? "是" : "否") << endl;
    25. //4、push(elem); //向栈顶添加元素
    26. s1.push(20);
    27. s1.push(17);
    28. //8、size();   //返回栈大小
    29. cout << "8、栈大小:" << s1.size() << endl;
    30. //6、top();      //返回栈顶元素
    31. cout << "6、栈顶元素:" << s1.top() << endl;
    32. //5、pop();      //从栈顶移除第一个元素
    33. s1.pop();
    34. cout << "5、移除栈顶元素后,栈大小:" << s1.size() << endl;
    35. //2、stack(const stack& stk);   //拷贝构造函数
    36. stack<int> s2(s1);
    37. cout << "2、通过拷贝构造函数初始化栈,栈大小:" << s1.size() << endl;
    38. //3、stack& operator=(const stack& stk);  //重载运算符=
    39. stack<int> s3;
    40. s3 = s2;
    41. cout << "3、通过重载运算符=赋值栈,栈大小:" << s1.size() << endl;
    42. system("pause");
    43. return 0;
    44. }

    输出结果

    7、栈是否为空:是
    8、栈大小:2
    6、栈顶元素:17
    5、移除栈顶元素后,栈大小:1
    2、通过拷贝构造函数初始化栈,栈大小:1
    3、通过重载运算符=赋值栈,栈大小:1

    3、queue容器

    queue是一种先进先出(First In First Out, FIFO)的数据结构,它有两个出囗,只有队头和队尾能被外界访问,因此不允许有遍历 为,可以判断队列是否为空,也可以返回队列大小,如下图所示:

    3.1、queqe常用接囗

    构造函数

    • queue que;                   //queue采用模板类实现,queue对象的默认构造形式
    • queue(const queue& que); //拷贝构造函数

    赋值操作

    • queue& operator(const queue& que);  //重载运算符=

    数据存取

    • push(elem);  //向队尾添加元素
    • pop();           //从队头移除第一个元素
    • back();         //返回最后一个元素
    • front();         //返回第一个元素

    大小操作

    • empty();  //判断队列是否为空
    • size();      //返回栈大小
    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // STL - queue - 常用接囗
    7. /*函数原型:
    8. 构造函数
    9. 1、queue que;            //queue采用模板类实现,queue对象的默认构造形式
    10. 2、queue(const queue& que); //拷贝构造函数
    11. 赋值操作
    12. 3、queue& operator(const queue& que);  //重载运算符=
    13. 数据存取
    14. 4、push(elem);  //向队尾添加元素
    15. 5、pop();       //从队头移除第一个元素
    16. 6、back();      //返回最后一个元素
    17. 7、front();     //返回第一个元素
    18. 大小操作
    19. 8、empty();  //判断队列是否为空
    20. 9、size();   //返回栈大小
    21. */
    22. //1、queue que; 默认构造函数
    23. queue<int> q1;
    24. //4、push(elem);  //向队尾添加元素
    25. q1.push(22);
    26. q1.push(16);
    27. q1.push(67);
    28. //9、size();   //返回栈大小
    29. cout << "9、添加元素后,队列大小:" << q1.size() << endl;
    30. //6、back();      //返回最后一个元素
    31. cout << "6、最后一个元素:" << q1.back() << endl;
    32. //7、front();     //返回第一个元素
    33. cout << "7、第一个元素:" << q1.front() << endl;
    34. //2、queue(const queue & que); //拷贝构造函数
    35. queue<int> q2(q1);
    36. cout << "2、拷贝构造函数,队列大小:" << q1.size() << endl;
    37. //3、queue& operator(const queue& que);  //重载运算符=
    38. queue<int> q3 = q1;
    39. cout << "3、重载运算符=,队列大小:" << q1.size() << endl;
    40. cout << "8、重载运算符=,队列是否为空:" << (q1.empty() ? "是" : "否") << endl;
    41. //8、empty();  //判断队列是否为空
    42. while (!q1.empty())
    43. {
    44. //5、pop();       //从队头移除第一个元素
    45. q1.pop();
    46. }
    47. cout << "5、移除所有元素后,队列大小:" << q1.size() << endl;
    48. system("pause");
    49. return 0;
    50. }

    输出结果

    9、添加元素后,队列大小:3
    6、最后一个元素:67
    7、第一个元素:22
    2、拷贝构造函数,队列大小:3
    3、重载运算符=,队列大小:3
    8、重载运算符=,队列是否为空:否
    5、移除所有元素后,队列大小:0

  • 相关阅读:
    Java Tomcat内存马——Servlet内存马
    【C语言 | 符号】C语言中符号易出错的地方
    C# tcp通信连接正常判断
    Hive中窗口函数的基本语法和示例
    java之ArrayList和Vector源码分析
    03 【布局之Aspect-Ratio Container Box-Decoration-Break Object-Fit Object-Position】
    时间轴_打印机
    【完全二叉树魔法:顺序结构实现堆的奇象】
    IntelliJ IDEA 安装及创建Java项目
    OVS与Linux Bridge的区别整理
  • 原文地址:https://blog.csdn.net/ling1998/article/details/126112636