• C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器


    1. 课程大纲

    02实现基本原理

    容器,算法,迭代器

    教室:容器

    人:元素

    教室对于楼:容器

    序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器

    关联式容器: 教室中 按年龄排座,进去的人已经确定好应该坐在哪了

    算法:遍历 查找 删除 统计 …

    迭代器:就理解为一个指针

    STL中容器和算法式是离开的,通过迭代器进行操作

     

    03 STL基本概念理论       

     

    迭代器其实是对指针的封装,是类对象,里面有各种重载

    04 string字符串常用操作

     

     

     

    05 string课堂案例

     

    06 vector容器概念

     

    vector容器 单口容器

     

    vector 类似于一个数组 从尾部操作 效率高 防止从中间插导致移位

    push_back

    pop_back

     

    也提供insert()方法

     

    begin()   //返回迭代器

    rbegin()  //返回迭代器

     

    front() // 返回元素

    back() // 返回元素

    07 vector容器初始化

     

    08上午课程回顾

    09 vector容器常用操作       

    reserve: 为容器预留空间 但空间内不真正创建元素

    resize: 改变容器大小 再创建对象(第一个参数是新容器大小,第二个参数是要加入容器中d额新元素 如果这个参数被忽略,就调用元素对象的默认构造函数)

    10vector自动增长原理和resize和reserve的区别

    int arr[] = {6,8,3.9};

    vector<int> v(arr,arr + sizeof(arr) /sizeof(int))

    v.insert(v.begin(),100)   // 头部插入元素

    vector<int>::iterator pStart = v.begin()

    vector<int>::iterator pEnd = v.end()

    while(pStart != pEnd){

       cout << *pStart << “ “ ;

       pStart++;

    }

    cout << endl;

    // 或者可以这样写

    for(vector<int>::iterator it = v.begin();it != v.end(); it++)

    cout << *it << “ “ ;

    ……

    }

    // 删除

    int val = v.back();

    cout << val << “被删除” << endl;

    v.pop_back();

    // 从指定位置全删

    v.erase(v.begin())

     // 区间删除

    v.erase(v.begin(),v.end()); // 也等价于 v.clear()

     cout << “size:” << v.size() << endl;

    11 deque容器概念

    deque容器的设计

    11vector容器swap小技巧

    Vector自动增长的原理:

    一般情况下:

     

    12 deque容器基本操作

     

    13 deque容器案例_评委打分

    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>

    #include <string>

    #include <vector>

    #include <deque>

    #include <algorithm>

     

    using namespace std;

     

    /*

     评委打分案例(sort算法排序)

     1.创建五个选手(姓名,得分)

     2.10个评委对5个选手进行打分

     得分规则:去除最高分,去除最低分,取出平均分

     3.按得分对5名选手进行排名

     

    */

     

    class Player {

    public:

        Player(string name, int score) :name(name), score(score) {};

        string name;

        int score;

    private:

    };

     

    // 创建选手

    void Create_Player(vector<Player> & v)

    {

        string nameseed = "ABCDE";

     

        for (int i = 0; i < 5; i++)

        {

            string name = "选手";

            name += nameseed[i];

            Player p(name, 0); // 创建选手

            v.push_back(p);

        }

    };

     

     

    // 给sort函数使用的回调函数

    bool mycompare(int v1, int v2)

    {

        return v1 > v2; // 从大到小排序 ==== v1>v2 return true,v1<v2 return false

    }

     

    // 设置选手分数

    void Set_Player_Score(vector<Player> &pvector)

    {

        //先对vector进行遍历,vector中存的是一个一个的人

        for (vector<Player>::iterator it = pvector.begin(); it != pvector.end(); it++)

        {

            // 对每一个人都声明了dscore deque(double-end queue)

            deque<int> dscore;

     

            // 让10个评委进行打分,随即打分,从后面push_back进去

            for (int i = 0; i < 10; i++)

            {

                int score = 50 + rand() % 50; // 打分 最高100分

                dscore.push_back(score);

            }

     

           

            // 排序 sort

            sort(dscore.begin(), dscore.end(), mycompare);

       

     

            dscore.pop_front(); // 去除最高分

            dscore.pop_back();  // 去除最低分

     

            // 分数总和

            int totalscore = 0;

     

            // 对deque进行遍历 求出分数总和

            for (deque<int>::iterator dit = dscore.begin(); dit != dscore.end(); dit++)

            {

                //cout << *dit << " ";

                totalscore += *dit;

            }

            // 求出平均分

            int scoreavg = totalscore / dscore.size();

            // 平均分赋给sit->score

            (*it).score = scoreavg;

        }

    }

     

    void Show_Player_Score(vector<Player> & pvector)

    {

        for (vector<Player>::iterator it = pvector.begin(); it != pvector.end(); it++)

        {

            cout << "姓名:" << it->name << "分数:" << it->score << endl;

        }

        cout << endl;

    }

     

     

    int main(void)

    {

        vector<Player> vPlayer;// 建立vector 存放选手信息

        Create_Player(vPlayer); // 在vector中创建5个选手

        Set_Player_Score(vPlayer); // 设置选手分数

        Show_Player_Score(vPlayer); // 展示选手分数

     

        return 0;

    }

  • 相关阅读:
    数据结构与算法4—队列
    栈的应用——括号匹配
    迷宫求解
    python的socket编程
    数据结构与算法3—栈
    数据结构与算法2—链表
    数据结构与算法1—线性表
    增量解析
    ElementTree类
    节点序列化
  • 原文地址:https://www.cnblogs.com/eret9616/p/10653902.html
Copyright © 2020-2023  润新知