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;

}

原文地址:https://www.cnblogs.com/eret9616/p/10653902.html