deque容器的基本概念
功能:
- 双端数组,可以对头端进行插入删除操
duque和vector的区别:
- vector对于头部的插入删除效率较低,数据量越大,效率越低
- deque相对而言,对头部的插入和删除速度要比vector快
- vector访问元素时的速度要比deque快,这和两者内部实现有关
deque的内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内存,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像是一片连续的内存空间
deque构造函数
功能:
- deque容器构造
函数原型:
- deque deq; //默认构造函数
- deque(beg,end); //构造函数将[beg, end]区间中的元素拷贝给本身
- deque(n ,elem); //构造函数将n个elem拷贝给本身
- deque(const deque &deq); //拷贝构造函数
示例:
#include<iostream>
using namespace std;
#include<deque>
//deque构造函数
//- deque<T> deq; //默认构造函数
//-deque(beg, end); //构造函数将[beg, end]区间中的元素拷贝给本身
//-deque(n, elem); //构造函数将n个elem拷贝给本身
//-deque(const deque & deq); //拷贝构造函数
void Print(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
//*it = 100;传入的是常量引用,不可对其进行修改操作
cout << *it << " ";
}
cout << endl;
}
void _01Test01()
{
//默认构造
deque<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
Print(d1);
//-deque(beg, end); //构造函数将[beg, end]区间中的元素拷贝给本身
deque<int> d2(d1.begin() + 1, d1.end() - 1);
Print(d2);
//-deque(n, elem); //构造函数将n个elem拷贝给本身
deque<int> d3(10, 100);
Print(d3);
//-deque(const deque & deq); //拷贝构造函数
deque<int>d4(d3);
Print(d4);
}
void main()
{
_01Test01();
}
deque容器赋值操作
功能:
- 给deque容器进行赋值操作
函数原型:
- deque& operator=(const deque& deq); //重载赋值运算符
- assign(beg,end); //将[beg,end]区间中的数据拷贝赋值给本身
- assign(n, elem); //将n个elem拷贝赋值给本身
#include<iostream>
using namespace std;
#include<deque>
//vector赋值操作
void ShowDeque(deque<int>& d)
{
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void _02Test01()
{
//等号赋值
deque<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
deque<int>d2 = d1;
cout << "d2: ";
ShowDeque(d2);
//assign(v.begin(),v.end());
deque<int> d3(d1.begin(), d1.end());
cout << "d3: ";
ShowDeque(d3);
//assign(n, elem)
deque<int>d4(10, 100);
cout << "d4: ";
ShowDeque(d4);
}
void main()
{
_02Test01();
}
deque容量和大小
功能:
对deque容器进行容量和大小的操作
函数原型:
empty(); //判断容器容量是否为空
size(); //返回容器中元素的个数
resize(int num); //重新指定容器的长度为num,若容器变长,则默认值0填充新的位置。如果容器变短,则末尾 超出容器长度的元素被删除。
resize(int num, elem); //重新指定容器的长度为num, 若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
示例:
#include<iostream>
using namespace std;
#include<deque>
void PrintMyDeque(deque<int >& d)
{
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void _03Test01()
{
deque<int> d;
for (int i = 0; i < 10; i++)
{
d.push_back(i);
}
PrintMyDeque(d);
//判断容器是否为空
if (d.empty())
{
cout << "容器为空" << endl;
}
else {
cout << "容器不为空" << endl;
cout << "容器大小为:" << d.size() << endl;
//cout << "容器容量为:" <<d.capacity() << endl;
}
//重新指定大小
d.resize(20);
//cout << "重新指定大小后,容器容量为:" << v.capacity() << endl;
//重新指定大小并填入elem
d.resize(25, 2);
PrintMyDeque(d);
cout << "重新指定大小并填入elem,容器大小为:" << d.size() << endl;
//cout << "重新指定大小并填入elem,容器容量为:" << v.capacity() << endl;
}
void main()
{
_03Test01();
}
deque插入和删除
功能:
对deque容器进行插入、删除操作
函数原型:
两端插入操作:
- push_back(elem); //在容器尾部插入一个数据
- push_front(elem); //在容器头部插入一个数据
- pop_back(); //删除容器最后一个数据
- pop_front(); //删除容器第一个数据
指定位置操作: - insert(pos,elem); //迭代器指向位置pos插入一个元素elem,返回新数据的位置
- inser(pos, n, elem) //迭代器指向位置pos插入n个元素elem,无返回值
- insert(pos, beg, end); //在pos位置插入[beg, end] 区间的数据,无返回值
- erase(const_iterator pos); //删除迭代器指向的元素
- erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素
- clear(); //删除容器中的所有元素
示例:
#include<iostream>
using namespace std;
#include<deque>
//deque 插入和删除数据操作
//- push_back(elem); //在容器尾部插入一个数据
//-push_front(elem); //在容器头部插入一个数据
//-pop_back(); //删除容器最后一个数据
//-pop_front(); //删除容器第一个数据
//**指定位置操作:**
//-insert(pos, elem); //迭代器指向位置pos插入一个元素elem,返回新数据的位置
//-inser(pos, n, elem) //迭代器指向位置pos插入n个元素elem,无返回值
//- insert(pos, beg, end); //在pos位置插入[beg, end] 区间的数据,无返回值
//-erase(const_iterator pos); //删除迭代器指向的元素
//-erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素
//-clear(); //删除容器中的所有元素
void MyShowDeq(deque<int>& d)
{
if (d.empty())
{
cout << "容器为空" << endl;
return;
}
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void _04Test01()
{
//尾插
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_back(40);
d.push_back(50);
//遍历
MyShowDeq(d);
//头插
d.push_front(100);
MyShowDeq(d);
//尾删
d.pop_back();
MyShowDeq(d);
//头删
d.pop_front();
MyShowDeq(d);
//插入 第一个参数是迭代器
d.insert(d.begin() + 1, 100);
MyShowDeq(d);
//删除 参数也是迭代器
d.erase(d.begin() + 1);
MyShowDeq(d);
//清空容器
d.clear();
MyShowDeq(d);
}
void main()
{
_04Test01();
}
deque数据存取
功能:
对deque中的数据进行存取操作
函数原型:
at(int index); //返回索引index所指的数据
operator[](int index); //返回索引index所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
示例:
#include<iostream>
using namespace std;
#include<deque>
//数据存取
//at(int index); //返回索引index所指的数据
//operator[](int index); //返回索引index所指的数据
//front(); //返回容器中第一个数据元素
//back(); //返回容器中最后一个数据元素
void MyShowVector(deque<int>& d)
{
if (d.empty())
{
cout << "容器为空" << endl;
return;
}
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void _05Test01()
{
deque<int> d;
for (int i = 0; i < 10; i++)
{
d.push_back(i);
}
MyShowVector(d);
//利用[]下标方式来访问数组的元素
cout << "利用下标访问: ";
for (int i = 0; i < d.size(); i++)
{
cout << d[i] << " ";
}
cout << endl;
//利用at方式来访问元素
cout << "利用at方式来访问元素: ";
for (int i = 0; i < d.size(); i++)
{
cout << d.at(i) << " ";
}
cout << endl;
//获取第一个元素
cout << "第一个元素为:" << d.front() << endl;
//获取最后一个元素
cout << "最后一个元素为: " << d.back() << endl;
}
void main()
{
_05Test01();
}
deque容器排序
功能:
- 利用算法实现对deque容器进行排序
算法: - sort(iterator beg, iterator end); //对beg和end区间内元素进行排序
示例:
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
//deque容器 排序
//- sort(iterator beg, iterator end); //对beg和end区间内元素进行排序
void ShowMyVector(deque<int>& d)
{
if (d.empty())
{
cout << "容器为空" << endl;
return;
}
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void _06Test01()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_back(40);
d.push_front(100);
d.push_front(200);
d.push_front(400);
d.push_front(300);
cout << "排序前:" << endl;
ShowMyVector(d);
sort(d.begin(), d.end());
cout << " 排序后:" << endl;
ShowMyVector(d);
}
void main()
{
_06Test01();
}