目录
deque 容器基本概念
Vector 容器是单向开口的连续内存空间,deque 则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然, vector 容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。
Deque 容器和 vector 容器最大的差异:
一 deque 允许使用常数项时间对头端进行元素的插入和删除操作。
常数项时间:提升性能的方式,插入和删除的时间复杂度几乎不变
二 deque 没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来
结论:vector开空间浪费资源,但执行性能会更好,随机访问会更好; deque没有浪费空间资源,但算法处理更复杂,执行性能更低。
存储数据时,一般都使用vector,deque操作中间过程
头文件
#include <deque>
deque容器应用
主要写了于vector的区别,没有提及到的调用方法使用和vector容器两者几乎一致。(与vector容器使用有区别的代码用红色字体标记)
没有学习vector容器的建议先学习vector容器 点击:Vector容器学习
代码 | 含义 |
---|---|
deque.size(); | 返回容器中元素的个数 |
deque.empty(); | 判断容器是否为空 |
push_back(elem); | 在容器尾部添加一个数据 |
push_front(elem); | 在容器头部插入一个数据 |
pop_back(); | 删除容器最后一个数据 |
pop_front(); | 删除容器第一个数据 |
#include <deque>
void printDequeInt(deque <int> &d) //打印函数
{
deque<int>::iterator it = d.begin(); //创建迭代器 指向容器的头部
while(it != d.end()) //使用迭代器遍历打印容器内容
{
cout<<*it++<<" ";
}
cout<<endl;
}
void test_01()
{
deque <int>d; //定义deque容器
d.push_back(10); //尾插 和vector容器相同
d.push_back(20);
d.push_back(30);
d.push_front(40); //于vector容器多了头插
d.push_front(50);
d.push_front(60);
printDequeInt(d); //打印容器元素
cout<<"大小"<<d.size()<<endl; //deque容器没有容量的概念 但是可以查看大小
}
存取数据
代码 | 含义 |
---|---|
at(idx); | 返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range。 |
operator[]; | 返回索引 idx 所指的数据,如果 idx 越界,不抛出异常,直接出错。 |
front(); | 返回第一个数据。 |
back(); | 返回最后一个数据 |
insert(pos,n,elem); | 在 pos 位置插入 n 个 elem 数据,无返回值。 |
erase(beg,end); | 删除[beg,end)区间的数据,返回下一个数据的位置。 |
#include <deque>
void printDequeInt(deque <int> &d) //打印函数
{
deque<int>::iterator it = d.begin(); //创建迭代器 指向容器的头部
while(it != d.end()) //使用迭代器遍历打印容器内容
{
cout<<*it++<<" ";
}
cout<<endl;
}
void test_01()
{
deque <int>d;
d.push_back(10);
d.push_back(20);
d.push_front(30);
d.push_front(40);
printDequeInt(d);
// front(); 返回第一个数据。 back(); 返回最后一个数据
cout<<"头元素"<<d.front()<<" 尾元素"<<d.back()<<endl;
cout<<d[1]<<" "<<d.at(2)<<endl; //at可抛出异常
//注意:下标从0开始 所说的第一个元素为下标为1
//insert(pos,n,elem); 在 pos 位置插入 n 个 elem 数据,无返回值。
d.insert(d.begin()+1,3,100); //插入 从第一个元素插入3歌100
printDequeInt(d); //打印
//erase(beg,end); 删除[beg,end)区间的数据,返回下一个数据的位置。
d.erase(d.begin()+1,d.begin()+4);//删除 从第一个元素删除到第4个元素
printDequeInt(d);
}
案例(作业)
有 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<vector> //vector容器头文件
#include<deque> //deque容器头文件
#include<time.h> //随机数的头文件
#include<algorithm> //算法头文件-排序,求总分
#include <numeric> //accumulate头文件
class Person{
friend void playGame(vector<Person> &v);
friend void printPerson(vector<Person> &v);
private:
string name; //选手
float score; //分数
public:
Person(){}
Person(string name, float score){
this->name = name;
this->score = score;
}
};
void createPerson(vector<Person> &v){
string tempName = "ABCDE";
for (int i = 0; i<5; i++){
string name = "选手";
name += tempName[i]; //选手A
v.push_back(Person(name, 0.0f)); //存储姓名,分数暂时为0
}
}
void printPerson(vector<Person> &v)
{
vector<Person>::iterator it = v.begin();
for (; it != v.end(); it++){
cout << (*it).name << " " << (*it).score << "; " << endl;;
}
}
void playGame(vector<Person> &v)
{
//伪随机:每次运行循环出来的值都是一致的; 需要设置真随机(带种子的随机数)
srand(time(NULL)); //带种子的随机--真随机
vector<Person>::iterator it = v.begin();
for (; it != v.end(); it++){ //取出5个选手
deque<float> d; //通过deque容器存储10个分数
//每个选手都有10个评委给出分数
for (int i = 0; i<10; i++){
float score = static_cast<float>(rand() % 41 + 60); //分数为60~100
d.push_back(score); //存储10个分数
cout << score << "--";
}
sort(d.begin(), d.end()); //算法中提供的函数;参数为起始地址和结束地址
d.pop_front(); //去掉最低分
d.pop_back(); //去掉最高分
//算法中的,起始地址和结束地址范围的汇总;第三个参数为0,表示初始值为0
cout << "总分:" << accumulate(d.begin(), d.end(), 0) << endl;//使用算法中提供的函数算出总和
float avg = accumulate(d.begin(), d.end(), 0) / (float)d.size();
(*it).score = avg; //给每个选手存储分数
}
}
void test_01(){
//1.创建vector,存储Person,Person中有name,score
vector<Person> v;
createPerson(v); //创建Person容器
playGame(v); //选手比赛,内部,评委给定分数
printPerson(v); //打印选手分数
}
由于作者水平有限,内容纯手敲整理可能有误。
如果有哪些不足或者错误的地方,也希望大家督促我改正哦。