01、目录
文章目录
02、deque简介与使用
2.1、 简介
C++队列(deque)是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
- deque(发音类似“deck”),是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可 以像两端进行伸缩。
- 特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过 随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。
- deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高 效。与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加偏移 量方式访问元素可能会导致非法的操作。
- vector与list提供了相似的接口,因此其具有类似的用途,但是内部的实现原理不同:vector使用使用了 动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存了 一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比 vector复杂,但是这些额外信息使得dque在某些情况下增长更加的高效,特别是在序列比较大,重新分 配成本比较高的情况下。
- 除了在频繁在头部或尾部进行插入和删除操作外,deque比list和forward_list的性能更差。
2.2、 使用
-
deque的构造
-
deque的迭代器
双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护器“整体连续”的假象,被deque的迭代器实现了,原理图如下:
-
deque的容量操作
-
deque的元素访问操作
-
deque中修改操作
03、deque成员函数表及示例
这里的话,我主要讲几个常用的成员函数,因为这个deque容器本来就用的少,函数的话,讲一下常用的即可。
函数(Function) | 描述(Description) |
---|---|
push_back() | 在deque容器尾部插入一个元素(尾插) |
push_front() | 在deque容器头部插入一个元素(头插) |
pop_back() | 在deque容器尾部删除一个元素(尾删) |
pop_front() | 在deque容器头部删除一个元素(头删) |
front() | 返回第一个元素 |
back() | 返回最后一个元素 |
size() | 返回deque容器中元素的总个数 |
empty() | 返回值为bool类型,容器为NULL则为true |
3.1、 push_back() 和 push_front()
Syntax:
//void push_back( const TYPE &val );
//void push_front( const TYPE &val );
#include <iostream>
#include <deque>
using namespace std;
void test01()
{
deque<int> de;
de.push_front(1);
//下面我们就可以对比着写了
de.push_back(4); //在1的后面插入4
de.push_front(3); //在1的前面插入3
for(int i : de)
{
cout << i << " ";
}
cout << endl;
}
int main()
{
test01(); //打印3 1 4
system("pause");
return 0;
}
3.2、 pop_back() 和 pop_front()
Syntax:
//void pop_back();
//void pop_front();
#include <iostream>
#include <deque>
using namespace std;
void test01()
{
deque<int> de;
de.push_front(1);
//下面我们就可以对比着写了
de.push_back(4); //在1的后面插入4
de.push_front(3); //在1的前面插入3
for(int i : de)
{
cout << i << " ";
}
cout << endl;
//下面就我们就在上面的基础上做删除操作,且删除一次,看一次。
de.pop_back(); //尾删
for(int i : de)
{
cout << "pop_back后:" << i << endl; // 3 1
}
de.pop_front(); //头删
for(int i : de)
{
cout << "pop_front后:" << i << endl; // 1
}
}
int main()
{
test01();
system("pause");
return 0;
}
3.3、 front() 和 back()
Syntax:
// TYPE &front(); 返回队列第一个元素的引用。
// TYPE &back(); 返回一个引用,指向队列的最后一个元素。
#include <iostream>
#include <deque>
using namespace std;
void test01()
{
deque<int> de;
de.push_front(1);
//下面我们就可以对比着写了
de.push_back(4); //在1的后面插入4
de.push_front(3); //在1的前面插入3
for(int i : de)
{
cout << i << " ";
}
cout << endl;
//下面就我们就在上面的基础上做查值操作
cout << "第一个元素是:" << de.front() << endl; //3
cout << "最后一个元素是:" << de.back() << endl; //4
}
int main()
{
test01();
system("pause");
return 0;
}
3.4、 size()
Syntax:
#include <iostream>
#include <deque>
using namespace std;
void test01()
{
deque<int> de;
de.push_front(1);
de.push_front(10);
de.push_front(11);
//下面我们就可以对比着写了
de.push_back(4); //在1的后面插入4
de.push_front(3); //在1的前面插入3
for(int i : de)
{
cout << i << " ";
}
cout << endl;
//下面就我们就在上面的基础上操作
int len = de.size();
cout << "deque的大小是:" << len << endl; //5
}
int main()
{
test01();
system("pause");
return 0;
}
3.5、 empty()
Syntax:
#include <iostream>
#include <deque>
using namespace std;
void test01()
{
deque<int> de;
de.push_front(1);
de.push_front(10);
de.push_front(11);
//下面我们就可以对比着写了
de.push_back(4); //在1的后面插入4
de.push_front(3); //在1的前面插入3
for(int i : de)
{
cout << i << " ";
}
cout << endl;
//下面就我们就在上面的基础上操作
if(de.empty()) {
cout << "de为NULL" << endl;
}
else{
cout << "de不为NULL" << endl; //运行此句
}
}
int main()
{
test01();
system("pause");
return 0;
}
04、小结
只是简单的存储元素使用vector即可,如果对元素任意位置进行插入或者删除操作比较多,使用list即可,所以一般很少使用deque;deque的最大应用,就是用其作为标准库中stack和queue的底层结构。
关于deque的话,大概就只有这几个会用上,其他的迭代器等等,上面图片中已经有大致说明,了解即可,将重点放在vector、list、map、set等容器上即可。
版权声明:转载请注明出处,谢谢!