STL容器之deque
目录
一、什么是deque
1、deque概念
deque是双端数组,同时支持头部和尾部进行插入删除元素的操作,支持容器的遍历操作,支持迭代器的随机访问。
2、deque与vector的区别
1、vector虽说也可以利用insert()函数在头部插入数据,但效率会很低,因为插入时,需要把之后所有的元素往后挪位置,而且元素数量越大,效率会越低;
2、deque相对于vector而言,在头部插入就相当轻松,速度比vector快很多;
3、vector访问元素的速度比deque快,这与内部的实现有关系(deque内部有一个中控器)。
二、deque构造函数
1、默认无参构造函数;
2、参数为迭代器区间范围的构造函数,将区间范围内的元素拷贝给本身;
3、参数为N个相同元素的构造函数;
4、拷贝构造函数
void Constructor()
{
qDebug() << "构造函数...";
// 默认构造函数 deque<T> d
deque<int> d;
for( int i=0; i<5; i++ )
d.push_back(i);
Printfln(d);
// 带迭代器区间范围的构造函数
deque<int> d1(d.begin(), d.end());
Printfln(d1);
// 参数为N个相同元素的构造函数
deque<int> d2(4, 666);
Printfln(d2);
// 拷贝构造函数
deque<int> d3;
d3 = d;
Printfln(d3);
qDebug() << "构造函数结束...";
}
三、deque常用接口
1、deque赋值操作
deque的赋值操作与vector是一样的三部曲:
(1)利用operator =()的操作赋值;
(2)利用assign函数重载实现赋值操作。
void OperatorTest()
{
qDebug() << "赋值操作...";
deque<int> d1;
for( int i=0; i<10; i++ )
d1.push_back(i);
Printfln(d1);
deque<int> d2;
d2 = d1;
Printfln(d2);
deque<int> d3;
d3.assign(d1.begin(), d1.end());
Printfln(d3);
deque<int> d4;
d4.assign(10, 666);
Printfln(d4);
qDebug() << "赋值操作结束...";
}
2、deque大小操作
在deque中是没有像vector容量的概念,毕竟是通过中控器去操作,可以向前或者向后无限的扩大内存,和deque大小有关的接口:
(1)deque.empty():判断deque容器是否为空;
(2)deque.empty():获取容器中的元素个数;
(3)deque.resize(len)或者deque.reszie(len, element):
重新指定容器中的大小为len,如果重新指定后的长度比原来长,则默认0来填充,也可以利用element进行填充;如果重新指定后的长度比原来短,则舍弃后面的元素。
void SizeTest()
{
qDebug() << "大小操作...";
deque<int> d1;
for( int i=0; i<10; i++ )
d1.push_back(i);
Printfln(d1);
if( !d1.empty() )
{
qDebug() << "d1不为空!";
qDebug() << "d1的大小: " << d1.size();
d1.resize(15, 1);
Printfln(d1);
}
else {
qDebug() << "d1为空!";
}
qDebug() << "大小操作结束...";
}
3、deque插入和删除
void InsertDelete()
{
deque<int> d;
// 头部插入
d.push_front(100);
d.push_front(50);
d.push_front(10);
Printfln(d);
// 头部删除
d.pop_front();
Printfln(d);
// 尾部插入
d.push_back(200);
d.push_back(300);
d.push_back(400);
Printfln(d);
// 尾部删除
d.pop_back();
Printfln(d);
// erase()函数重载和clear()与vector相同
// insert()函数重载插入与vector相同,这里就不测试了
}
4、deque数据存取和排序
(1)deque.at(index):获取索引为index的元素;
(2)operator[]():与原生数组一样,利用deque[index],返回索引为index的元素;
(3)front():返回容器中第一个元素;
(4)back():获取容器中最后一个元素。
(5)利用STL标准库算法sort(deque.begin(), deque.end())进行排序,需要包含头文件#include <algorithm>。
void DataSort()
{
deque<int> d;
d.push_back(200);
d.push_back(100);
d.push_front(10);
d.push_front(50);
Printfln(d);
qDebug() << "容器中第一个元素: " << d.front();
qDebug() << "容器中最后一个元素: " << d.back();
sort(d.begin(), d.end());
qDebug() << "排序后的d: ";
Printfln(d);
}