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

相关文章
|
8天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
15 1
|
21天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
37 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
69 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
81 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
64 2
|
2月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
62 0
|
24天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
31 0
|
3月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
90 5
|
3月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
82 1
|
3月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
54 0