#定义
实现方式为队列,先进先出,可以理解为排队打饭
初始化函数
一个int类型的队列,默认为deque。
queue<int> q;
以其他模板类的方式初始化队列,对于第二个参数的要求为:只要它们支持:front()、back()、push_back() 和 pop_back()等操作。
std::queue<int,std::list<int>> q;
std::queue<int, std::vector<int>> q1;
std::queue<int, std::deque<int>> q2;
以一个queue初始化队列
std::queue<int> q;
std::queue<int> q1(q);
是否为空
空返回true,否则返回false
q.empty();
数组大小
返回当前元素个数
q.size();
获取第一个元素
返回第一个元素但不会在队列中删除该元素
q.front()
删除第一个元素
删除第一个元素,没有返回值
q.pop(); // 出队首元素 0
最后一个元素
获取最后一个元素
q.back()
添加一个元素
在最后一位添加一个元素
q.push(i);
生成一个默认构造函数生成的对象
例如 std::queue q; q.emplace(); 此时q的数量为1,参数的值为0
q.emplace();
双向队列 deque
初始化
默认构造函数,数组数量为0
std::deque<int> deque1;
以deque1初始化deque2,复制deque1的所有值
std::deque<int> deque2(deque1);
以deque1初始化deque3,复制deque1的所有值
std::deque<int> deque3 = deque1;
初始化中含有3个元素,并且三个元素都是3
std::deque<int> deque4(3, 3);
数组中含有5个值,并且每个值都调用构造函数
std::deque<int> deque5(5);
以数组的形式初始化构造函数,数组中的值为1,2,1,3,4,5
std::deque<int> deque6{ 1,2,1,3,4,5 };
以数组的形式初始化构造函数,数组中的值为1,2,1,3,4,5
std::deque<int> deque7 = { 1,2,1,3,4,5 };
是否为空
如果为空返回true,否则返回false
deque1.empty();
数组大小
返回当前元素的个数
int i = deque1.size();
重置大小
将数组的数量调整为10个,如果原有的数据个数小于10,则用5补充
deque7.resize(10,5);
将数组的数量调整为10个,如果原有的数据个数小于10,则用0补充,如果原有数据的个数大于10,则将多余的数据删除
deque7.resize(10);
由于deque实现机制,这些元素被删除后,分配给他们的内存空间可以被保留
因此改变mydeque大小为10之后,可能会有额外的内存空间在mydeque中未被使用
访问元素
以角标的方式获取第三个值,需要注意的是,角标的值必须是合法的否则会引起程序的崩溃
int i = deque7.at(3);
int i2 = deque7[3];
获取第一个值
int front = deque7.front();
获取最后一个值
int back = deque7.back();
数据修改
将数组中的数据替换为3个2
deque7.assign(3, 2);
将数据的数据替换为deque8的起始位置到deque8.begin()+3的位置,仍然为不包含deque8.begin()+3
deque7.assign(deque8.begin(), deque8.begin()+3);
以数据de的de【2】到de【3】之间的数据填充数据,并且不包含de【3】
int de[] = { 1,2,1,3,4,5 };
deque7.assign(de+2, de+3);
添加元素
在数据的结尾出添加一个元素
deque7.push_back(8);
在数组开始的位置添加一个元素
deque7.push_front(8);
在数据deque7.begin()的前面添加一个2
deque7.insert(deque7.begin(), 3);
在数据deque7.begin()的前面添加一个3个2
deque7.insert(deque7.begin(), 3, 2);
在数据deque7.begin()的前面添加deque8.begin( 到deque8.begin()+3的位置的数据,注意仍然为不包含deque8.begin()+3
deque7.insert(deque7.begin(), deque8.begin(), deque8.begin()+3);
emplace和insert的区别:
emplace和insert插入元素最大的区别就是emplace不会产生不必要的变量,使用insert插入元素时,需要申请内存空间创建临时对象,而申请内存空间就需要消耗一定时间;而使用emplace插入元素时,直接在原来容器的内存空间上 ,调用构造函数,不需要额外申请内存空间,就节省了很多时间,效率较高。
deque7.emplace(deque7.begin(), 8);
在容器尾部生成一个元素。和 push_back() 的区别是,该函数直接在容器尾部构造元素,省去了复制移动元素的过程。
deque7.emplace_back( 8);
deque7.emplace_front( 6);
删除数据
删除deque7.begin() + 2, deque7.begin() + 3的位置,同理为不包含deque7.begin() + 3,返回值为下一个位置的迭代器
deque7.erase(deque7.begin() + 2, deque7.begin() + 3);
删除deque7.begin()位置返回值为下一个位置的迭代器
deque7.erase(deque7.begin());
删除最后一个数据 无返回值
deque7.pop_back();
删除第一个数据 无返回值
deque7.pop_front();
清空数组
deque7.clear();
deque实现原理
deque的实现可以简单的理解为一个指针数组,而数据则会存在这个指针数组所存储的空间中,同时这些指针所指向的空间都是等长的,或者可以理解为一个二维数组 intA【】【3】;3位置填充满之后,会申请一个新的3个大小的内存存入intA【】中;而这个A【】中存的数据就是【3】所指向的空间的地址;
deque算法
deque的算法参考vector的算法
Vector