c++ 中的deque容器(案例练习)

#include <iostream>
using namespace std;

#include <vector>
#include <deque>
#include <algorithm>
//deque 容器 是双口容器, 可以从头尾部都可以添加,删除 push_front pop_front push_back pop_back


//deque 特性
//双端插入和删除元素效率高
//指定位置插入也会导致数据元素移动,降低效率
//可以随机存取,效率高



//deque 常用API


/*

void printdeque(deque<int> &v)
{
    for(deque<int>::iterator it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<endl;
    }
}



//deque 初始化
void test1()
{
    deque<int> d1;
    deque<int> d2(10,5);
    deque<int> d3(d2.begin(),d2.end());
    deque<int> d4(d3);
    for (deque<int>::iterator it=d4.begin();it!=d4.end();it++)
    {
        cout<<*it<<endl;
    }
}

//赋值 大小操作 empty() size() resize()

void test2()
{
    deque<int> d1;
    deque<int> d2;
    deque<int> d3;
    d1.assign(10,5);
    d2.assign(d1.begin(),d1.end());//迭代器指定区间进行赋值
    d3=d2;
    d1.swap(d3);
    if(d1.empty())
    {
        cout<<"空"<<endl;
    } else
    {
        cout<<"不为空"<<endl;
    }
}

//deque 容器的插入和删除  push_back pop_back push_front pop_front
void test3()
{
    deque<int> v;
    v.push_back(11);
    v.push_back(22);
    v.push_back(33);
    v.push_front(44);
    v.push_front(55);
    printdeque(v);

    int val=v.front();//查看要被删除的数据

    v.pop_front();//删除

}



//
//int main() {
//    test3();
//    return 0;
//}
//deque 数据存储

 */


//----------------------------------------------
//deque 案例练习
//案例:创建5个选手(姓名,得分),10个评委对5个选手进行打分,
//得分规则:去除最高分,去除最低份,取出平均分
//按得分对5名选手进行排名


#include <algorithm>

class person
{
public:
    string name;
    int score;

public:
    person()
    {}
    person(string name,int score)
    {
        this->name=name;
        this->score=score;
    }
};


void create_person(vector<person> &v)
{
    string s="ABCDE";
    for(int i=0;i<5;i++) {
        person p;
        p.name="选手";
        p.name+=s[i];
        v.push_back(p);
        }
}


void printscore(int v)
{
    cout<<v<<" ";

}

//打分
void setscore(vector<person> &v)
{
    for (vector<person>::iterator it =v.begin();it!=v.end();it++)
    {
        deque<int> d;
        for (int i = 0; i <10 ; ++i) {
            int score=rand()%41+60;

            d.push_back(score);

        }
        sort(d.begin(),d.end());//对随机生成的数据进行排序 默认排序为从小到大
        d.pop_back();//删除最后一个 去除最高
        d.pop_front();//删除第一个 去除最低
        for_each(d.begin(),d.end(),printscore);
        cout<<endl;

        //求平均
        int total=0;
        for(deque<int>::iterator id=d.begin();id!=d.end();id++)
        {
            total+=*id;
        }

        int average=total/d.size();

        (*it).score=average;

    }

}

//排序规则
bool mycompare(person& p1,person &p2)//传入容器中需要比对的对象
{
    return p1.score<p2.score;
}


//根据分数排序
void score_rank(vector<person> &v)
{
    //注意 容器和算法,通过迭代器沟通 sort算法中,若容器元素是int等常用数据类型则sort()为默认排序,可以直接排序,若容器中是对象,则需要用到第三个元素。
    //第三个元素是自定义排序规则
    sort(v.begin(),v.end(),mycompare);//mycopare 为自定义的排序规则
    for(vector<person>::iterator itt=v.begin();itt!=v.end();itt++)
    {
        cout<<(*itt).name<<" "<<(*itt).score<<endl;
    }

}

int main()
{
    vector<person> v;

    create_person(v);
    setscore(v);
    score_rank(v);

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
deque容器C++标准库的一种双向队列(double-ended queue)容器。它允许在两端进行插入和删除操作,因此可以高效地在头部和尾部进行元素操作。deque的全称是"double-ended queue",意为双端队列。 与vector容器相比,deque容器更适合在两端频繁地插入和删除元素。它的内部实现采用了分块连续内存的结构,每个内部块都可以容纳一定数量的元素。这种分块结构使得deque在两端插入和删除元素的时间复杂度为常数,而在间插入和删除元素的时间复杂度为线性。 deque容器提供了类似于vector的接口,可以使用push_back()和pop_back()在尾部插入和删除元素,也可以使用push_front()和pop_front()在头部插入和删除元素。此外,还可以使用[]运算符和at()函数访问指定位置的元素。deque还提供了一系列其他操作,例如插入、删除、修改指定范围内的元素等。 要使用deque容器,需要包含<deque>头文件,并使用std命名空间。下面是一个使用deque容器的简单示例: ```cpp #include <deque> #include <iostream> int main() { std::deque<int> deque; deque.push_back(1); deque.push_back(2); deque.push_front(0); for (int i : deque) { std::cout << i << " "; } std::cout << std::endl; return 0; } ``` 以上示例,首先包含了<deque>头文件,并创建了一个名为dequedeque容器。然后使用push_back()和push_front()分别在尾部和头部插入元素。最后使用for循环遍历deque容器的元素,并输出结果为"0 1 2"。 希望对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值