STL模板库-deque容器

目录

deque 容器基本概念

头文件

 deque容器应用

存取数据

案例(作业)


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);   //打印选手分数
}

 由于作者水平有限,内容纯手敲整理可能有误。

如果有哪些不足或者错误的地方,也希望大家督促我改正哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值