目录
功能:双端数组,头尾都能进行插入删除操作
与vector的区别:
1.vector对于头部的插入删除效率低,数据越多,效率越低
2.deque对头部删除插入的速度快,效率高
3.vector访问内部元素时的速度比deque快
注:图片来自STL源码剖析

这是一个双端队列,deque的内部实现很复杂,依靠中控器管理多个缓冲区

依靠相当复杂的迭代器实现,我还没这个能力去实现
打印函数
- void printDeque(deque<int>&d)//可用const_iterator限定只读
- {
- /*for (deque<int>::const_iterator i = d.begin(); i != d.end(); i++)
- cout << *i << " ";
- cout << endl;*/
- for (auto i : d)
- cout << i << " ";
- cout << endl;
- }
auto可自动推导类型,用const_iterator可防止数据被修改
可采用无参构造,指定迭代器区间构造,指定个数的元素赋值,以及拷贝构造
- 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(d1);
- deque<int>d3(7, 3);
- printDeque(d1);
- deque<int>d4(d3);
- printDeque(d1);
- }
- void test02()
- {
- deque<int>d1;
- for (int i = 0; i < 10; i++)
- d1.push_back(i);
- printDeque(d1);
- deque<int>d2;
- d2 = d1;
- printDeque(d2);
- deque<int>d3;
- d3.assign(d1.begin(), d1.end());
- printDeque(d3);
- deque<int>d4;
- d4.assign(7, 3);
- printDeque(d4);
- }
赋值可采用重载=号运算符以及使用assign函数
- void test03()
- {
- deque<int>d1;
- for (int i = 0; i < 10; i++)
- d1.push_front(i);
- printDeque(d1);
- if (d1.empty())
- cout << "d1为空" << endl;
- else
- cout << "d1不为空,大小为" << d1.size() << endl;
- d1.resize(5);//缩小舍去多余元素
- printDeque(d1);
- d1.resize(15, 7);//扩大并初始化新开辟的空间
- printDeque(d1);
- }
deque没有容量的概念,可以不断从两端开辟空间的。因此没有reserve预开辟空间,resize指定空间大小。
- void test04()
- {
- deque<int>d1, d2;
- d1.push_back(10);
- d1.push_back(20);
- d1.push_front(10);
- d1.push_front(20);
- d2 = d1;
- printDeque(d1);
- d1.pop_back();
- d1.pop_front();
- printDeque(d1);
- d2.insert(d2.begin(), 2333);
- printDeque(d2);
- d2.insert(d2.begin(), 3, 7);
- printDeque(d2);
- deque<int>d3;
- d3.push_back(1);
- d3.push_back(2);
- d3.push_back(3);
- d2.insert(d2.begin(),d3.begin(), d3.end());
- printDeque(d2);
-
- d2.erase(d2.begin()+1);
- printDeque(d2);
- d2.erase(d2.begin(), d2.end()-1);
- printDeque(d2);
- d2.clear();
- printDeque(d2);
- }
deque可以头插尾插,也可以头删尾删,insert插入有三种
1、向指定位置插入一个数据
2、向指定位置插入n个数据
3、将某一deque对象的某一区间数据插入到该deque对象的某一位置后面
此外erase删除函数,删除单个或指定区间的数据
clear函数清空所有数据
- void test05()
- {
- deque<int>d;
- d.push_back(1);
- d.push_back(2);
- d.push_back(3);
- d.push_front(1);
- d.push_front(2);
- d.push_front(3);
- for (int i = 0; i < d.size(); i++)
- cout << d[i] << " ";
- cout << endl;
- for (int i = 0; i < d.size(); i++)
- cout << d.at(i) << " ";
- cout << endl;
- d.pop_back();
- cout << d.front() << endl;
- cout << d.back() << endl;
- }
重载[],使用at方法访问deque容器存储的数据
- void test06()
- {
- deque<int>d;
- d.push_back(1);
- d.push_back(10);
- d.push_back(100);
- d.push_front(1000);
- d.push_front(500);
- d.push_front(250);
- printDeque(d);
- //对支持随机访问的迭代器都可用sort函数进行排序
- sort(d.begin(), d.end());
- printDeque(d);
-
- }
对支持随机访问的迭代器都可用sort函数进行排序,sorth函数需要引用头文件algorithm
sort默认从小到大排序,可以使用重载版本,传入第三个参数——自定义比较函数的地址,即函数名,设置排序依据。
目的功能:有5名选手ABCDE,有10名评委对其打分,去掉一个最高分和一个最低分,再取平均分作为其成绩。
- #include<iostream>
- #include<deque>
- #include<vector>
- #include<algorithm>//sort排序算法
- #include<string>
- #include<time.h>//生成随机成绩,设置时间戳
- #include<iomanip>//设置打印格式
- using namespace std;
- class Participant//创建参赛者类
- {
- string m_name;
- double m_grade;
- public:
- Participant(string name, double grade=0)//将成绩初始化为0
- {
- this->m_grade = grade;
- this->m_name = name;
- }
- void setScore(double grade)
- {
- this->m_grade = grade;
- }
- double getSore()
- {
- return this->m_grade;
- }
- string getName()
- {
- return this->m_name;
- }
- };
- void setParticipant(vector <Participant>&v)//设置参赛者名字
- {
- string t_name = "ABCDE";
- for (int i = 0; i < 5; i++)
- {
- string name = "选手";
- name += t_name[i];
- Participant p(name);
- v.push_back(p);
- }
- }
- void printList(vector<Participant>&v)//打印
- {
- for (auto i : v)
- cout << "姓名:" << i.getName() << "\t成绩:" << fixed << setprecision(2) << i.getSore()<<endl;//设置打印格式,保留两位小数
- }
- int main()
- {
- srand((unsigned int)time(NULL));//时间戳,设置有效随机数
- vector<Participant>v;
- setParticipant(v);
- for (vector<Participant>::iterator i=v.begin();i!=v.end();i++)
- {
- deque<double>d;//创建deque
- double sum = 0;
- for (size_t i = 0; i <10; i++)
- d.push_back(rand() % 41 + 60);//用deque存入随机成绩(60~100)
- sort(d.begin(), d.end());//排序
- d.pop_back();//去掉最高分
- d.pop_front();//去掉最低分
- for (size_t i = 0; i < d.size(); i++)
- sum += d[i];
- i->setScore(sum /d.size());//传入平均成绩
- }
- printList(v);
- return 0;
- }
不同容器适用于不同要求和目的。