【C++ STL】 --- deque

简介: 【C++ STL】 --- deque

1 deque容器基本概念

(1)功能:

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

(2)deque与vector区别:

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

deque相对而言,对头部的插入删除速度回比vector快

vector访问元素时的速度会比deque快,这和两者内部实现有关

(3)deque内部工作原理:

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

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

2 deque构造函数

功能描述:

deque容器构造

函数原型:

1. deque<T> deqT;           //默认构造形式
2. deque(beg, end);         //构造函数将[beg, end)区间中的元素拷贝给本身。
3. deque(n, elem);          //构造函数将n个elem拷贝给本身。
4. deque(const deque &deq); //拷贝构造函数
1. void printDeque(const deque<int>& d) 
2. {
3.  for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
4.    cout << *it << " ";
5. 
6.  }
7.  cout << endl;
8. }
9. //deque构造
10. void test01() {
11. 
12.   deque<int> d1; //无参构造函数
13.   for (int i = 0; i < 10; i++)
14.   {
15.     d1.push_back(i);
16.   }
17.   printDeque(d1);
18.   deque<int> d2(d1.begin(),d1.end());
19.   printDeque(d2);
20. 
21.   deque<int>d3(10,100);
22.   printDeque(d3);
23. 
24.   deque<int>d4 = d3;
25.   printDeque(d4);
26. }
27. 
28. int main() 
29. {
30.   test01();
31.   return 0;
32. }

总结:deque容器和vector容器的构造方式几乎一致,灵活使用即可

3、deque赋值操作

功能描述:

给deque容器进行赋值

函数原型:

1. deque& operator=(const deque &deq);     //重载等号操作符
2. assign(beg, end);                       //将[beg, end)区间中的数据拷贝赋值给本身。
3. assign(n, elem);                        //将n个elem拷贝赋值给本身。
1. void printDeque(const deque<int>& d) 
2. {
3.  for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
4.    cout << *it << " ";
5. 
6.  }
7.  cout << endl;
8. }
9. //赋值操作
10. void test01()
11. {
12.   deque<int> d1;
13.   for (int i = 0; i < 10; i++)
14.   {
15.     d1.push_back(i);
16.   }
17.   printDeque(d1);
18. 
19.   deque<int>d2;
20.   d2 = d1;
21.   printDeque(d2);
22. 
23.   deque<int>d3;
24.   d3.assign(d1.begin(), d1.end());
25.   printDeque(d3);
26. 
27.   deque<int>d4;
28.   d4.assign(10, 100);
29.   printDeque(d4);
30. 
31. }
32. 
33. int main() 
34. {
35.   test01();
36.   return 0;
37. }

总结:deque赋值操作也与vector相同,需熟练掌握

4、deque大小操作

功能描述:

对deque容器的大小进行操作

函数原型:

1. deque.size();                //返回容器中元素的个数
2. deque.resize(num);           //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
3. //如果容器变短,则末尾超出容器长度的元素被删除。
4. deque.resize(num, elem);     //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
5. //如果容器变短,则末尾超出容器长度的元素被删除
1. #include <deque>
2. 
3. void printDeque(const deque<int>& d) 
4. {
5.  for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
6.    cout << *it << " ";
7. 
8.  }
9.  cout << endl;
10. }
11. 
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.   //判断容器是否为空
23.   if (d1.empty()) {
24.     cout << "d1为空!" << endl;
25.   }
26.   else {
27.     cout << "d1不为空!" << endl;
28.     //统计大小
29.     cout << "d1的大小为:" << d1.size() << endl;
30.   }
31. 
32.   //重新指定大小
33.   d1.resize(15, 1);
34.   printDeque(d1);
35. 
36.   d1.resize(5);
37.   printDeque(d1);
38. }
39. 
40. int main() 
41. {
42.   test01();
43.   return 0;
44. }

总结:

deque没有容量的概念

判断是否为空 --- empty

返回元素个数 --- size

重新指定个数 --- resize

 

5、deque 插入和删除

功能描述:

向deque容器中插入和删除数据

函数原型:

1. 两端插入操作:
2. push_back(elem);             //在容器尾部添加一个数据
3. push_front(elem);            //在容器头部插入一个数据
4. pop_back();                  //删除容器最后一个数据
5. pop_front();                 //删除容器第一个数据
6. 
7. 指定位置操作:
8. insert(pos,elem);            //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
9. insert(pos,n,elem);          //在pos位置插入n个elem数据,无返回值。
10. insert(pos,beg,end);         //在pos位置插入[beg,end)区间的数据,无返回值。
11. clear();                     //清空容器的所有数据
12. erase(beg,end);              //删除[beg,end)区间的数据,返回下一个数据的位置。
13. erase(pos);                  //删除pos位置的数据,返回下一个数据的位置
1. void printDeque(const deque<int>& d) 
2. {
3.  for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
4.    cout << *it << " ";
5. 
6.  }
7.  cout << endl;
8. }
9. //两端操作
10. void test01()
11. {
12.   deque<int> d;
13.   //尾插
14.   d.push_back(10);
15.   d.push_back(20);
16.   //头插
17.   d.push_front(100);
18.   d.push_front(200);
19. 
20.   printDeque(d);
21. 
22.   //尾删
23.   d.pop_back();
24.   //头删
25.   d.pop_front();
26.   printDeque(d);
27. }
28. 
29. //插入
30. void test02()
31. {
32.   deque<int> d;
33.   d.push_back(10);
34.   d.push_back(20);
35.   d.push_front(100);
36.   d.push_front(200);
37.   printDeque(d);
38. 
39.   d.insert(d.begin(), 1000);
40.   printDeque(d);
41. 
42.   d.insert(d.begin(), 2,10000);
43.   printDeque(d);
44. 
45.   deque<int>d2;
46.   d2.push_back(1);
47.   d2.push_back(2);
48.   d2.push_back(3);
49. 
50.   d.insert(d.begin(), d2.begin(), d2.end());
51.   printDeque(d);
52. 
53. }
54. 
55. //删除
56. void test03()
57. {
58.   deque<int> d;
59.   d.push_back(10);
60.   d.push_back(20);
61.   d.push_front(100);
62.   d.push_front(200);
63.   printDeque(d);
64. 
65.   d.erase(d.begin());
66.   printDeque(d);
67. 
68.   d.erase(d.begin(), d.end());
69.   d.clear();
70.   printDeque(d);
71. }
72. 
73. int main() 
74. {
75.   //test01();
76.   //test02();
77. test03();    
78.   return 0;
79. }

总结:

插入和删除提供的位置是迭代器!

尾插 --- push_back

尾删 --- pop_back

头插 --- push_front

头删 --- pop_front

6、deque 数据存取

功能描述:

对deque 中的数据的存取操作

函数原型:

1. at(int idx);     //返回索引idx所指的数据
2. operator[];      //返回索引idx所指的数据
3. front();         //返回容器中第一个数据元素
4. back();          //返回容器中最后一个数据元素
1. void printDeque(const deque<int>& d) 
2. {
3.  for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
4.    cout << *it << " ";
5. 
6.  }
7.  cout << endl;
8. }
9. 
10. //数据存取
11. void test01()
12. {
13. 
14.   deque<int> d;
15.   d.push_back(10);
16.   d.push_back(20);
17.   d.push_front(100);
18.   d.push_front(200);
19. 
20.   for (int i = 0; i < d.size(); i++) {
21.     cout << d[i] << " ";
22.   }
23.   cout << endl;
24. 
25. 
26.   for (int i = 0; i < d.size(); i++) {
27.     cout << d.at(i) << " ";
28.   }
29.   cout << endl;
30. 
31.   cout << "front:" << d.front() << endl;
32. 
33.   cout << "back:" << d.back() << endl;
34. }
35. 
36. int main() 
37. {
38.   test01();
39.   return 0;
40. }

总结:

除了用迭代器获取deque容器中元素,[ ]和at也可以

front返回容器第一个元素

back返回容器最后一个元素

7、deque排序

功能描述:

利用算法实现对deque容器进行排序

算法:

sort(iterator beg, iterator end)     //对beg和end内元素进行排序
1. void printDeque(const deque<int>& d) 
2. {
3.  for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
4.    cout << *it << " ";
5. 
6.  }
7.  cout << endl;
8. }
9. 
10. void test01()
11. {
12. 
13.   deque<int> d;
14.   d.push_back(10);
15.   d.push_back(20);
16.   d.push_front(100);
17.   d.push_front(200);
18. 
19.   printDeque(d);
20.   sort(d.begin(), d.end());
21.   printDeque(d);
22. }
23. 
24. int main() 
25. {
26.   test01();
27.   return 0;
28. }

总结:sort算法非常实用,使用时包含头文件 algorithm即可

目录
相关文章
|
1天前
|
设计模式 算法 C++
【C++】STL之迭代器介绍、原理、失效
【C++】STL之迭代器介绍、原理、失效
13 2
|
1天前
|
存储 C++ 容器
C++:STL - set & map
C++:STL - set & map
14 4
|
1天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
16 0
|
1天前
|
存储 Serverless C++
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
10 1
|
1天前
|
存储 设计模式 算法
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
14 1
|
1天前
|
存储 编译器 C++
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
5 0
|
1天前
|
算法 C++ 容器
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
11 0
|
1天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
1天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
1天前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构