一、deque容器基本概念
- 功能:双端数组,可以对头端进行插入和删除操作。
- deque与vector区别;
- vector对于头部的插入删除效率低,数据量越大,效率越低。
- deque相对而言,对头部的插入删除速度比vector快。
- vector访问元素时的速度会比deque快,这和两者内部实现有关。
deque内部工作原理:
deque内部有个中控器,维护每个阶段缓冲区中的内容,缓冲区中存放真实数据。中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。
deque容器的迭代也是支持随机访问的。
二、deque构造函数
函数原型:
代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//deque构造函数
void test01()
{
deque<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);
deque<int>d2(d1.begin(), d1.end());
printDeque(d2);
deque<int>d3(5, 100);
printDeque(d3);
deque<int>d4(d3);
printDeque(d4);
}
int main()
{
test01();
system("pause");
return 0;
}
输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100
100 100 100 100 100
请按任意键继续. . .
三、deque容器赋值操作
函数原型:
代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//deque赋值
void test01()
{
deque<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);
// operator= 赋值
deque<int>d2 = d1;
printDeque(d2);
// assign 赋值
deque<int>d3;
d3.assign(d1.begin(), d1.end());
printDeque(d3);
//n个数 赋值
deque<int>d4;
d4.assign(5, 100);
printDeque(d4);
}
int main()
{
test01();
system("pause");
return 0;
}
输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100
请按任意键继续. . .
四、deque大小操作
函数原型:
deque没有容量概念。
代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
deque<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);
if (d1.empty()) //判断是否为空
{
cout << "d1为空" << endl;
}
else
{
cout << "d1不为空" << endl;
cout << "d1大小为:" << d1.size() << endl; //返回元素个数
//deque没有容量概念
}
//重新指定大小
d1.resize(15, 1); //输出:0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
printDeque(d1);
d1.resize(5);
printDeque(d1);//输出:0 1 2 3 4
}
int main()
{
test01();
system("pause");
return 0;
}
输出:
0 1 2 3 4 5 6 7 8 9
d1不为空
d1大小为:10
0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
0 1 2 3 4
请按任意键继续. . .
五、deque插入和删除
函数原型:
- 两端插入操作:
- 指定位置操作:
代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//deque插入和删除
void test01()
{
cout << "test01 run ..." << endl;
deque<int>d1;
//尾插
d1.push_back(10);
d1.push_back(20);
//头插
d1.push_front(30);
d1.push_front(40);
//40 30 10 20
printDeque(d1);
//尾删
d1.pop_back();
//40 30 10
printDeque(d1);
//头删
d1.pop_front();
//30 20
printDeque(d1);
}
void test02()
{
cout << "test02 run ..." << endl;
deque<int>d1;
d1.push_back(10);
d1.push_back(20);
d1.push_front(30);
d1.push_front(40);
//40 30 10 20
printDeque(d1);
//insert插入
//在起始位置插入1000
d1.insert(d1.begin(), 1000);
//1000 40 30 10 20
printDeque(d1);
//在头部插入两个10000
d1.insert(d1.begin(), 2, 10000);
//10000 10000 1000 40 30 10 20
printDeque(d1);
//按照区间进行插入
deque<int>d2;
d2.push_back(1);
d2.push_back(2);
d2.push_back(3);
//将d2的所有区间元素插入d1头部
d1.insert(d1.begin(), d2.begin(), d2.end());
//1 2 3 10000 10000 1000 40 30 10 20
printDeque(d1);
}
void test03()
{
cout << "test03 run ..." << endl;
deque<int>d1;
d1.push_back(10);
d1.push_back(20);
d1.push_front(30);
d1.push_front(40);
//删除
deque<int>::iterator it = d1.begin();
it++;
d1.erase(it);
//40 10 20
printDeque(d1);
//按照区间方式删除
d1.erase(d1.begin(), d1.end());
//换行
//printDeque(d1);
//清空
d1.clear();
//换行
printDeque(d1);
}
int main()
{
test01();
test02();
test03();
system("pause");
return 0;
}
输出:
test01 run ...
40 30 10 20
40 30 10
30 10
test02 run ...
40 30 10 20
1000 40 30 10 20
10000 10000 1000 40 30 10 20
1 2 3 10000 10000 1000 40 30 10 20
test03 run ...
40 10 20
请按任意键继续. . .
- 总结:
- 插入和删除提供的位置是迭代器。
- 尾插 — push_back
- 尾删 — pop_back
- 头插 — push_front
- 头删 — push_back
六、deque数据存取
函数原型:
代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//deque数据存取
void test01()
{
cout << "test01 run ..." << endl;
deque<int>d1;
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
d1.push_front(100);
d1.push_front(200);
d1.push_front(300);
//通过 [] 方式访问元素
//300 200 100 10 20 30
for (int i = 0; i < d1.size(); i++)
{
cout << d1[i] << " ";
}
cout << endl;
//通过at方式访问元素
//300 200 100 10 20 30
for (int i = 0; i < d1.size(); i++)
{
cout << d1.at(i) << " ";
}
cout << endl;
cout << "第一个元素为:" << d1.front() << endl; //300
cout << "最后一个元素为:" << d1.back() << endl; //30
}
int main()
{
test01();
system("pause");
return 0;
}
七、deque排序
算法:
sort(iterator beg,iterator end); //对beg和end的区间内元素进行排序
代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//deque容器排序
void test01()
{
cout << "test01 run ..." << endl;
deque<int>d1;
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
d1.push_front(100);
d1.push_front(200);
d1.push_front(300);
cout << "排序前:";
printDeque(d1); //300 200 100 10 20 30
//排序 --- 默认排序是升序,从小到大
//对于支持随机访问迭代器的容器,都可以利用sort算法直接对其进行排序
//vector容器也可以利用sort进行排序
//使用sort需要包含标准算法头文件
sort(d1.begin(), d1.end());
cout << "排序后:";
printDeque(d1); //10 20 30 100 200 300
}
int main()
{
test01();
system("pause");
return 0;
}
输出:
test01 run ...
排序前:300 200 100 10 20 30
排序后:10 20 30 100 200 300
请按任意键继续. . .