
a、deque插入和人删除常数项时间(不会因为数据量的大小,改变操作所耗时间)
b、deque容器没有容量的概念以分段连续空间组成
c、deque是由一段一段的定量的连续空间组成

#include
#include
using namespace std;
/*
* 1、deque构造函数
* deque deqT;//默认构造形式
* deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
* deque(n, elem);//构造函数将n个elem拷贝给本身。
* deque(const deque &deq);//拷贝构造函数。
* 2、deque赋值操作
* assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
* assign(n, elem);//将n个elem拷贝赋值给本身。
* deque& operator=(const deque &deq); //重载等号操作符
* swap(deq);// 将deq与本身的元素互换
*/
void printDequeInt(deque<int> &d){
for(deque<int>::iterator it = d.begin(); it != d.end(); it++){
cout << *it << " ";
}
cout << endl;
}
void test01(){
deque<int> d(5,10);
printDequeInt(d);//10 10 10 10 10
//assign(n, elem);//将n个elem拷贝赋值给本身。
deque<int> d1;
d1.assign(5,100);
printDequeInt(d1);//100 100 100 100 100
//deque& operator=(const deque &deq); //重载等号操作符
deque<int> d2;
d2 = d1;
printDequeInt(d2);//100 100 100 100 100
//swap(deq);// 将deq与本身的元素互换
deque<int> d3(5,1);
deque<int> d4(5,2);
printDequeInt(d3);//1 1 1 1 1
printDequeInt(d4);//2 2 2 2 2
d3.swap(d4);
printDequeInt(d3);//2 2 2 2 2
printDequeInt(d4);//1 1 1 1 1
}
int main(int argc, char *argv[])
{
test01();
return 0;
}
运行结果:

/*
3.3.3.3 deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
6deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
3.3.3.4 deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
3.3.3.5 deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
front();//返回第一个数据。
back();//返回最后一个数据
*/
void test02(){
deque<int> d;
//尾部插入
d.push_back(10);
d.push_back(20);
d.push_back(30);//10 20 30
//头部插入
d.push_front(40);
d.push_front(50);
d.push_front(60);
printDequeInt(d);//60 50 40 10 20 30
//头部删除
d.pop_front();//50 40 10 20 30
//尾部删除
d.pop_back();//50 40 10 20
printDequeInt(d);//50 40 10 20
if(d.empty()){
cout << "d容器为空" << endl;
}else{
cout<<"d容器非空"<<endl;
cout<<"size = "<<d.size()<<endl;//4
}
//[]访问第二个元素
cout<<"d[2] = "<<d[2]<<endl;//10
cout<<"d.at(2) = "<<d.at(2)<<endl;//10
cout<<"头元素 = "<<d.front()<<endl;//50
cout<<"尾元素 = "<<d.back()<<endl;//20
}
int main(int argc, char *argv[])
{
test02();
return 0;
}
运行结果:

/*
3.3.3.6 deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
3.3.3.7 deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置
*/
void test03() {
deque<int> d;
d.insert(d.begin(),5, 100);
printDequeInt(d);//100 100 100 100 10017
d.clear();
cout<<"size = "<<d.size()<<endl;//0
}
运行结果:

案例:有5名选手:选手ABCDE,10个评委分别对每一名选手打分, 去除最高分,去除评委中最低分,取平均分,最后输出每位选手的分数
- 创建五名选手,放到vector中
- 遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容 器中
- sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分
- deque容器遍历一遍,累加分数,累加分数/d.size()
- person.score = 平均分
#include
#include
#include
#include
#include
#include
using namespace std;
//选手类
class Person{
public:
string name;
int score;
Person(string name,int score){
this->name = name;
this->score = score;
}
};
void createPerson(vector<Person> &v){
//5名选手是ABCDE
string name = "ABCDE";
for(int i = 0; i < 5; i++){
string str = "选手";
str += name[i];
//将选手的姓名 分数0 放入vector容器中
v.push_back(Person(str,0));
}
}
void aveScore(vector<Person> &v){
//设置随机种子
srand(time(NULL));
//容器v中的每个人 逐一比赛
for(vector<Person>::iterator it = v.begin(); it != v.end(); it++){
//每位选手 都要被10个评委打分 放入deque容器中
deque<int> d;
//10个评委
for(int i = 0; i < 10; i++){
int score = rand()%41+60;//60~100
d.push_back(score);
}
//对deque容器(评委的10个分数)排序
sort(d.begin(), d.end());
//去掉一个最低分 最高分
d.pop_back();
d.pop_front();
//得到每个选手的总分数
int sum = accumulate(d.begin(),d.end(),0);
//获取平均分 赋值 选手的score
(*it).score = sum/8;
}
}
void printVectorPerson(vector<Person> &v) {
for(vector<Person>::iterator it=v.begin();it!=v.end();it++) {
//*it == Person
cout<<(*it).name<<" "<<(*it).score<<endl;
}
}
int main(int argc, char *argv[])
{
//1、定义一个vector容器存放5名选手
vector<Person> v;
createPerson(v);
//2、5名选手逐一比赛求成绩平均分
aveScore(v);
//3、将5名选手的成绩打印出来
printVectorPerson(v);
return 0;
}
运行结果:

int main(int argc, char *argv[])
{
//设置随机数种子time(NULL)获取当前时间
srand(time(NULL));
for(int i = 0; i < 10; i++){
//rand()函数的返回值就是随机数
int num = rand();
cout<<num<<" ";
}
cout << endl;
return 0;
}
运行结果:

先进后出的数据结构。
push入栈、pop出栈、top永远指向栈顶元素
stack没有迭代器

/*
3.4.3.1 stack构造函数
stack stkT;//stack采用模板类实现, stack对象的默认构造形式:
stack(const stack &stk);//拷贝构造函数
3.4.3.2 stack赋值操作
stack& operator=(const stack &stk);//重载等号操作符
3.4.3.3 stack数据存取操作
push(elem);//向栈顶添加元素
pop();//从栈顶移除第一个元素
top();//返回栈顶元素
3.4.3.4 stack大小操作
empty();//判断堆栈是否为空
size();//返回堆栈的大小
*/
void test01()
{
stack<int> s;
//入栈
s.push(10);
s.push(20);
s.push(30);
s.push(40);
if(s.empty()) {
cout<<"栈容器为空"<<endl;
}
else {
cout<<"栈容器非空"<<endl;
cout<<"size = "<<s.size()<<endl;
}
while(!s.empty()) {
cout<<s.top()<<endl;
//出栈
s.pop();
}
}
int main(int argc, char *argv[])
{
test01();
return 0;
}
运行结果:

队列容器:先进先出 队尾插入数据 对头删除数据
queue容器:没有迭代器 不具备遍历功能 只能通过front、back访问

/*
3.5.3.1 queue构造函数
queue queT;//queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数
3.5.3.2 queue存取、插入和删除操作
push(elem);//往队尾添加元素
pop();//从队头移除第一个元素
back();//返回最后一个元素
front();//返回第一个元素
3.5.3.3 queue赋值操作
queue& operator=(const queue &que);//重载等号操作符
3.5.3.4 queue大小操作
empty();//判断队列是否为空
size();//返回队列的大小
*/
#include
void test02() {
queue<int> q;
q.push(10);
q.push(20);
q.push(30);
q.push(40);
if(q.empty()) {
cout<<"容器为空"<<endl;
}
else {
cout<<"容器非空"<<endl;
cout<<"size = "<<q.size()<<endl;
cout<<"对头元素 = "<<q.front()<<endl;//10
cout<<"队尾元素 = "<<q.back()<<endl;//40
}
cout<<"遍历队列"<<endl;
while(!q.empty()) {
cout<<q.front()<<" ";
q.pop();//出队
}
}
int main(int argc, char *argv[])
{
test02();
return 0;
}
运行结果:
