STL——容器(deque) 构造 & 头尾添加删除元素
1.deque容器概念
deque是“double-ended queue”的缩写,和vector一样都是STL的容器,唯一不同的是:deque是双端数组,而vector是单端的。
、
Deque 特点:
- deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
- deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法)
- deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元素或移除元素比较费时。
使用时,包含头文件:#include <deque>
2. deque 的无参构造与有参构造
deque 的用法与 vector 类似,无参构造时不会分配内存,可以用过 push_back() 在后方添加元素,可以通过迭代器或指定参数对 deque 的空间进行赋值
1 #include <iostream> 2 #include <deque> 3 4 using namespace std; 5 6 class student 7 { 8 public: 9 student(int age) 10 { 11 this->age = age; 12 cout << "调用构造函数" << endl; 13 } 14 int age; 15 }; 16 17 18 int main() 19 { 20 //无参构造,这样的 deque 没有分配内存 21 deque<int> deqInt; 22 deque<float> deqFloat; 23 deque<student> deqStu; 24 deque<student*> deqStuP; 25 26 deqInt.push_back(111); //deqInt 尾部插入1个元素 27 deqInt.push_back(222); //deqInt 尾部插入1个元素 28 deqInt.push_back(333); //deqInt 尾部插入1个元素 29 deqFloat.push_back(0.1f); 30 deqStu.push_back(student(18)); 31 32 //带参构造 33 //方式一:用迭代器给定区间 34 deque<int> deqInt_A(deqInt.begin(),deqInt.end()); 35 cout << "deqInt_A 中的元素为:" << endl; 36 for (int i = 0; i < deqInt_A.size(); i++) 37 { 38 cout << deqInt_A[i] << endl; 39 } 40 41 //方式二:指定n个元素进行拷贝 10 个 0 42 deque<int> deqInt_B(5, 0); 43 cout << "deqInt_B 中的元素为:" << endl; 44 for (int i = 0; i < deqInt_B.size(); i++) 45 { 46 cout << deqInt_B[i] << endl; 47 } 48 49 //方式三:拷贝构造 50 deque<int> deqInt_C(deqInt_B); 51 52 cout << "dequeInt_C 中的元素为:" << endl; 53 for (int i = 0; i < deqInt_C.size(); i++) 54 { 55 cout << deqInt_C[i] << endl; 56 } 57 58 return 0; 59 }
打印结果:
3. deque 的两端删除与插入,(头部插入和删除操作,是比 vector 多出来的功能)
1 #include <iostream> 2 #include <deque> 3 4 using namespace std; 5 6 int main() 7 { 8 int Test[] = { 111,222 }; 9 deque<int> deqInt_A(Test, Test + 2); 10 cout << "初始 deqInt_A 中的元素为:" << endl; 11 for (int i = 0; i < deqInt_A.size(); i++) 12 { 13 cout << deqInt_A[i] << endl; 14 } 15 16 printf("==================================\n"); 17 //deque.push_back 尾部添加 18 cout << "使用 push_back 在尾部添加 333" << endl; 19 deqInt_A.push_back(333); 20 cout << "对 deqInt_A 进行遍历:" << endl; 21 for (int i = 0; i < deqInt_A.size(); i++) 22 { 23 cout << deqInt_A[i] << endl; 24 } 25 26 printf("==================================\n"); 27 //deque.push_front 头部添加, 这个是比 vector 多出来的功能 容器的头部操作 28 cout << "使用 push_front 在头部添加 0" << endl; 29 deqInt_A.push_front(0); 30 cout << "对 deqInt_A 进行遍历:" << endl; 31 for (int i = 0; i < deqInt_A.size(); i++) 32 { 33 cout << deqInt_A[i] << endl; 34 } 35 36 printf("==================================\n"); 37 //deque.pop_back 尾部删除 38 cout << "使用 pop_back 尾部删除" << endl; 39 deqInt_A.pop_back(); 40 cout << "对 deqInt_A 进行遍历:" << endl; 41 for (int i = 0; i < deqInt_A.size(); i++) 42 { 43 cout << deqInt_A[i] << endl; 44 } 45 46 printf("==================================\n"); 47 //deque.pop_front 头部删除, 这个是比 vector 多出来的功能 容器的头部操作 48 cout << "使用 pop_front 头部删除 " << endl; 49 deqInt_A.pop_front(); 50 cout << "对 deqInt_A 进行遍历:" << endl; 51 for (int i = 0; i < deqInt_A.size(); i++) 52 { 53 cout << deqInt_A[i] << endl; 54 } 55 56 return 0; 57 }
打印结果:
========================================================================================================================