【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即可

相关文章
|
3月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
10月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
287 2
|
10月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
574 73
|
11月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
10月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
458 3
|
11月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
703 1
|
12月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
326 21
|
11月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
287 2
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
417 7