C++ deque容器操作 总结

------------------------------------ deque容器

                      双口容器

-----基本操作:

插入 push_back() push_front() insert()

front() back()    处理元素

begin() end() rbegin() rend()    处理迭代器

删除 pop_front() pop_back()

-----特性总结:

  双端插入和删除元素效率更高

  指定位置插入也会导致数据元素移动,降低效率

  可随机存储,效率高

-----------------------------deque         API

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与本身元素互换

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(); 返回最后一个元素

测试代码如下:

#include<iostream>

#include<deque>

using namespace std;



void PrintDeque (deque<int> deq) {    //迭代器遍历

    for (deque<int>::iterator it = deq.begin();it != deq.end();it ++) {

        cout << *it << " ";

    }

    cout << endl;

}



//初始化

void test01 () {

    deque<int> d1;

    deque<int> d2(10,5);

    deque<int> d3(d2.begin(),d2.end());

    deque<int> d4(d3);

    //迭代器方式 打印d4

    PrintDeque(d4);    

}

//赋值大小操作

void test02 () {

    deque<int> d1;

    deque<int> d2;

    deque<int> d3;

    d1.assign(10,5);

    d2.assign(d1.begin(),d1.end()); //迭代器指定区间赋值

    d3 = d2;    //等号赋值

    d1.swap(d2);    //交换空间元素

    if (d1.empty()) {

        cout << "空!" << endl;

    }

    else cout << "size:" << d1.size() << endl;

    d1.resize(5);   //十个元素,保留前五个

}



//deque 容器的插入和删除

void test03 () {

    deque<int> d1;

    d1.push_back(100);

    d1.push_front(200);

    d1.push_back(300);

    d1.push_back(400);

    d1.push_front(500);

    //5 2 1 3 4

    PrintDeque(d1);

    cout << d1.front() << " " << endl; //拿到被删除的数据

    d1.pop_front();    //删除头

    cout << d1.back() << " " << endl;

    d1.pop_back();    //删除尾

    PrintDeque(d1);

}

练习:

----------------------评委打分案例---------------------------

评委打分案例(sort 算法排序)
创建5个选手(姓名,得分),10个评委对5个选手进行打分
得分规则:去掉最高分,去掉最低分,取平均值
按得分对5名选手进行排名

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<deque>
#include<string>
#include<algorithm>
using namespace std;

//选手类
class Player { 
public:
    Player () {} 
    Player (string name,int score):name(name),score(score) {} 
public:
    string name;
    int score;
};

//创建选手
void Creat_Player (vector<Player>& v) {
    string nameSeed = "ABCDE";
    for (int i = 0;i < 5;i ++) {
        Player p;
        p.name += nameSeed[i];
        p.score = 0;
        v.push_back(p);
    }
}

//回调函数1 (用于测试)
void PrintScore (int val) {
    cout << val << " ";
}

//打分
void Set_Score (vector<Player>& v) {
    //设置随机种子
    srand(time(0));
    for (vector<Player>::iterator it = v.begin();it != v.end();it ++) {
        //当前学生进行打分
        //存储随机生成分数
        deque<int> dScroe;
        
        for (int i = 0;i < 10;i ++) {
            int score = rand() % 41 + 60;
            dScroe.push_back(score);
        }
        //对分数排序    默认从小到大
        sort(dScroe.begin(),dScroe.end());

        //for_each(dScroe.begin(),dScroe.end(),PrintScore);
        //cout << endl;

        //去除最高分 和 最低分
        dScroe.pop_front();
        dScroe.pop_back();
        //求平均分
        int totalScore = 0;
        for (deque<int>::iterator it = dScroe.begin();it != dScroe.end();it ++) {
            totalScore += (*it);
        }
        int avgScore = totalScore / dScroe.size();
        //保存分数
        (*it).score = avgScore;
    }
}

//排序规则
bool cmp (Player& p1,Player& p2) {
    return p1.score > p2.score;
}

//回调函数2
void PrintResult (Player& p) {
    cout << "姓名:" << p.name << " 分数:" << p.score << endl;
}

//根据选手分数排序  sort算法默认从小到大 改为从大到小
void Print_Score (vector<Player>& v) {
    //排序
    sort(v.begin(),v.end(),cmp);
    for_each(v.begin(),v.end(),PrintResult);
}

int main () {
    vector<Player> vPlist;
    Creat_Player(vPlist);
    Set_Score(vPlist);
    Print_Score(vPlist);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值