- 课程大纲
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;
}