C++知识小屋(10):STL——deque常见函数小结

       STL在C++中起到非常重要的作用,最大的好处就是将常见的数据结构进行了封装,使得我们不需要从底层一步步去实现,使用起来非常方便。C++知识小屋🏠的STL系列旨在将常见STL库的常见函数进行小结,以函数+示例+结果展示的方式作为文章的整体结构。希望能够在用到这些库的时候能够快速上手,熟练地使用它们来解决一些常见的问题。

deque是什么

  • 现在我们来回顾一下前面几节学到过的STL容器,按照能不能用迭代器访问可以大体分成两类:

    • 支持迭代器访问:map(可用下标访问),set,multimap,multiset,vector(可用下标访问),list
    • 不支持迭代器访问:栈(stack),队列(queue),优先队列(priority_queue)
  • 说实话,上面的两种类型有着各自的优缺点:

    • 比如list能够快速地插入和删除,但是不能用下标快速访问。
    • 比如vector能够用下标访问,但是插入删除的效率非常低。
    • 比如栈,队列,优先队列不能用迭代器访问,要访问所有元素必须不断弹出先前的元素。
  • 双端队列deque可以简单理解为是vector和list的融合,既可以用迭代器访问,也可以用"[]"下标访问,当然,它所要花费的内存空间自然也是非常大的。

  • 如果要使用deque,需要在程序的开头加上下面的库:
    #include <deque>

deque的用法

上面提到了deque同时包含了list和vector的功能,那么下面用一个例子来说说它的用法:

  1. deque提供了三种插入元素的方法,分别为push_front,push_back,insert

  2. deque提供了三种遍历输出元素的方法:迭代器访问,"[]"下标访问法,与vector类似的.at()函数访问法

  3. deque提供了三种删除元素的方法,分别为pop_front,pop_back,erase

    • 可以看到下面的例子,首先创建一个名为A的deque容器,开始时为空,size为0
    • 通过push_back发现元素输入到了deque的后面,push_front发现元素输入到了deque的前面,通过insert方法将"coke"输入到了第二个位置
    • 通过下标"[]"方法和迭代器的方法遍历了元素均成功
    • 通过erase删除了第二个位置的元素"coke"
    • 通过pop_front删除了最前面的元素"apple"
    • 通过pop_back删除了最后面的元素"orange"
#include <iostream>
#include <deque>
#include <string>
using namespace std;

int main(){
	//构造对象A (后面的两个'>'中间一定要有空格,否则会报错) 
	deque<string> A;
	
	cout << "刚开始的时候A.empty() = " <<  A.empty() << "  ,A.size() = " << A.size() << endl << endl;
	cout << "当前容器的最大存储量为: " << A.max_size() << endl << endl;
	//插入元素, push_back表示从后面插入, push_front表示从前面插入 
	A.push_back("cool");	//从后面输入 
	A.push_back("orange");
	A.push_front("pandas"); //从前面输入 
	A.push_front("apple");
	
	//两种输出deque的方法
	cout << "下标法输出: " ;
	for(int i=0;i<A.size();i++){
		cout << A[i] << " ";
	}
	cout << endl << endl;
	
	cout << "迭代法输出: " ;
	for(deque<string>::iterator it = A.begin();it!=A.end();it++){
		cout << *it << " ";
	}
	cout << endl << endl;
	
	
	//删除元素
	A.erase(A.begin() + 1);
	cout << "erase删除第二个元素后(A.at(i)法输出)): " ;
	for(int i=0;i<A.size();i++){
		cout << A.at(i) << " ";
	}
	cout << endl << endl;	 
	
	A.pop_front();
	cout << "pop_front删除最前面的元素后: " ;
	for(int i=0;i<A.size();i++){
		cout << A.at(i) << " ";
	}
	cout << endl << endl;	 	
	
	A.pop_back();
	cout << "pop_back删除最后面的元素后: " ;
	for(int i=0;i<A.size();i++){
		cout << A.at(i) << " ";
	}
	cout << endl << endl;	 	
	
	return 0;
} 


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值