deque容器 双端动态数组
deque容器和vector容器最大的差异:
a、deque插入和删除 常数项时间(不会因为数据量的大小 改变操作所耗时)
b、deque容器没有容量的概念 以分段连续空间组成。
c、Deque是由一段一段的定量的连续空间构成。
1、deque容器的构造 和赋值
deque构造函数
deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
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
}
运行结果:
2、deque容器的大小操作、双端插入删除操作、元素访问操作
deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
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
}
运行结果:
3、容器的插入删除
deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
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 100
d.clear();
cout<<"size = "<<d.size()<<endl;//0
}
运行结果:
4、案例:有5名选手:选手ABCDE,
10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分,最后输出每位选手的分数
步骤分析:
1. 创建五名选手,放到vector中
2. 遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容器中
3. sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分
4. deque容器遍历一遍,累加分数,累加分数/d.size()
5. person.score = 平均分
#include <iostream>
#include<string>
#include<vector>
#include<deque>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
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 nameTmp="ABCDE";
for(int i=0;i<5;i++)
{
string name="选手:";
name += nameTmp[i];
//将选手的姓名 分数0 放入vector容器中
v.push_back(Person(name,0));
}
}
void printVectorPerson(vector<Person> &v)
{
for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
{
//*it == Person
cout<<(*it).name<<" "<<(*it).score<<endl;
}
}
void playGame(vector<Person> &v)
{
//设置随机种子
srand(time(NULL));
//容器v中的每个人 逐一比赛
for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
{
//*it == Person
//每位选手 都要被10个评委打分 放入deque容器中
deque<int> d;
for(int i=0;i<10;i++)//10个评委
{
int score = rand()%41+60;//60~100
d.push_back(score);
}
//对deque容器(评委的10个分数)排序
sort(d.begin(), d.end());//去掉一个最低分 最高分
//去掉一个最低分
d.pop_front();
//去掉一个最高分
d.pop_back();
//得到每个选手的总分数
int sum = accumulate(d.begin(),d.end(), 0);
//获取平均分 赋值 选手的score
(*it).score = sum/d.size();
}
}
int main(int argc, char *argv[])
{
//1、定义一个vector容器存放5名选手
vector<Person> v;
createPerson(v);
//2、5名选手 逐一比赛
playGame(v);
//3、将5名选手的成绩打印出来
printVectorPerson(v);
return 0;
}
运行结果:
5、srand设置随机种子 rand 产生随机数
#include <iostream>
#include<time.h>
using namespace std;
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;
}
运行结果: