STL容器课程
第二课 《无限成长盒——认识Vector(动态数组)》
第一幕:魔法盒子诞生
1、很久很久以前。
(1)程序王国里。
小程序员小C已经学会了数组。
他十分开心。
因为数组可以保存很多很多数据。
(2)例如:
保存五个数字。
int a[5];保存十个数字。
int a[10];保存一百个数字。
int a[100];(3)可是……
有一天。
国王交给了他一个新任务。
2、国王的新任务
(1)国王说:
今天有一些小朋友来报名参加编程比赛。
一开始来了:
3个人。
后来又来了:
5个人。
下午。
又来了:
20个人。
晚上。
又来了:
100个人。
(2)小C办理登记。
他说:
"我用数组!"
开始写下:
int student[10];开始保存。
可是……
到了第11个学生。
程序停住了。
因为:
盒子满了!
3、思考一下
如果数组只能放10个人。
后来来了100个人。
怎么办?
学生通常会回答:
"开一个更大的数组!"
例如:
int student[100];老师继续问:
那原来的10个人怎么办?
是不是还要:
一个一个复制过去?
如果后来来了1000个人呢?
是不是又要重新复制?
孩子很快就会发现:
数组好像不太方便。
第二幕:魔法工程师发明了Vector
1、就在大家发愁的时候。
程序王国最厉害的工程师来了。
他说:
"不用重新开盒子。"
"我发明了一个自己会长大的盒子。"
它的名字叫:
Vector(动态数组)
2、为什么叫动态数组?
因为:
它和数组一样。
也是按顺序保存数据。
但是:
空间不够的时候。
它会自己长大!
3、所以:
Vector还有一个中文名字:
动态数组。
第三幕:请出Vector
1、和以前一样。
想使用一个工具。
必须先把工具请出来。
#include <iostream> #include <vector> using namespace std;2、以前:
int a[100];是数组。
3、今天:
vector<int> a;就是动态数组。
第四幕:创建第一个Vector
vector<int> score;1、vector
表示:
我要使用动态数组。
2、int
里面保存整数。
3、score
变量名字。
整个意思就是:
创建一个可以保存很多整数<int>的动态数组 vector 的对象,它的名字叫score。
第五幕:往盒子里放东西——push_back()
1、现在盒子是空的。
放进去一个数字。
score.push_back(95);再放。
score.push_back(88);继续放。
score.push_back(100);这时候。
盒子里面就是:
95 88 1002、第一个完整程序
#include <iostream> #include <vector> using namespace std; int main() { vector<int> score; score.push_back(95); score.push_back(88); score.push_back(100); cout << "成绩如下:" << endl; for (int i = 0; i < score.size(); i++) { cout << score[i] << " "; } return 0; }输出:
成绩如下: 95 88 100第六幕:Vector也有下标
1、数组这样访问:
a[2]Vector呢?
答案:
一样。
score[0] score[1] score[2]2、访问和数组几乎一样!
这就是Vector最大的优点。
第七幕:有多少个元素?
1、数组:
int a[100];同学们必须记住:
到底用了几个。
例如利用计数器:
cnt2、而Vector不用。
直接调用size函数就知道:
score.size()例如:
cout << score.size();输出:
3是不是方便很多?
第八幕:最后一个同学退出比赛——pop_back()
1、假设:
盒子里面。
95 88 100最后一个人退出。
怎么办?
score.pop_back();现在:
95 88是不是很方便?
注意:
只能删除最后一个。
第九幕:看看第一个和最后一个
1、继续介绍两个很有用的成员函数。
(1)取第一个元素
front()表示:
第一个元素。
例如:
cout << score.front();输出:
95(2)取最后一个元素
back()例如:
cout << score.back();输出:
88第十幕:盒子空了吗?
1、想知道里面有没有东西。
怎么办?
直接问。
score.empty()2、如果为空。
返回:
true否则:
false3、例如:
if(score.empty()) { cout<<"盒子空了"; } else { cout<<"还有东西"; }第十一幕:清空盒子
全部不要了。
score.clear();一下子全部清空。
第十二幕:课堂小游戏——猜结果
第一题
vector<int> a; a.push_back(3); a.push_back(5); a.push_back(8); cout<<a.size();答案:
3第二题
a.pop_back(); cout<<a.back();答案:
5第三题
a.clear(); cout<<a.empty();答案:
1(true)
第十三幕:魔法整理机器人——Vector排序(sort)
一、使用sort需要的头文件
sort不是Vector里面的成员函数。
它属于:
算法工具(algorithm)
所以。
除了
#include <vector>还要再请一位帮手。
#include <algorithm>完整写法:
#include <iostream> #include <vector> #include <algorithm> using namespace std;二、sort怎么用?
1、常见写法:
sort(a.begin(), a.end());意思就是:
把a里面所有元素排序。
同学们只需要记住一句口诀:
begin() 是开始。
end() 是结束。
2、所以:
sort(开始,结束);就是:
从第一个元素。
一直排到最后一个元素。
三、<vector>的排序程序
例如:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> score; score.push_back(95); score.push_back(60); score.push_back(88); score.push_back(100); score.push_back(75); sort(score.begin(), score.end()); cout << "排序后:" << endl; for(int x : score) { cout << x << " "; } return 0; }运行结果:
60 75 88 95 100排序前:
95 60 88 100 75↓
sort以后。
60 75 88 95 100四、为什么是写begin()和end()?
1、画图
+----+----+----+----+----+ 95 60 88 100 75 ↑ ↑ begin() end()2、begin()
就是:
第一个元素的位置。
3、end()
不是最后一个元素。
而是:
最后一个元素后面的那个位置。
4、这样写。
sort才能知道:
"我要整理整个盒子。"
五、课堂实践——整理水果价格
1、水果店今天进货。
价格分别是:
12 5 20 8 152、老板说:
请按价格从便宜到贵排列。
3、参考程序:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> price; price.push_back(12); price.push_back(5); price.push_back(20); price.push_back(8); price.push_back(15); sort(price.begin(), price.end()); cout << "价格排序后:" << endl; for(int x : price) { cout << x << " "; } return 0; }输出:
5 8 12 15 20六、课堂实践——学生成绩排名
1、老师输入5位同学成绩。
例如:
90 75 100 88 952、要求:
按照成绩从低到高输出。
3、参考程序:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> score; for(int i = 0; i < 5; i++) { int x; cin >> x; score.push_back(x); } sort(score.begin(), score.end()); cout << "成绩排名:" << endl; for(int x : score) { cout << x << " "; } return 0; }例如输入:
90 75 100 88 95输出:
75 88 90 95 100八、课堂小游戏——猜排序结果
第一题
vector<int> a; a.push_back(5); a.push_back(2); a.push_back(8); a.push_back(1); sort(a.begin(),a.end());输出:
1 2 5 8第二题
vector<int> a; a.push_back(30); a.push_back(10); a.push_back(20); sort(a.begin(),a.end());输出:
10 20 30第三题
vector<int> a; a.push_back(7); a.push_back(7); a.push_back(3); a.push_back(5); sort(a.begin(),a.end());输出:
3 5 7 7sort不会删除重复元素,它只是把元素按顺序排列。
九、本节课总结
今天,我们认识了STL中的自动排序机器人——sort()。
不用自己写冒泡排序、选择排序等代码,只需一行代码,就能快速完成排序。
记住今天最重要的两句话:
#include <algorithm>表示请出排序工具。
sort(a.begin(), a.end());表示把整个vector从小到大排序。
记忆口诀
整理数据不用愁,
sort出手解烦忧;begin()从头走,end()排到最后头;
一行代码排整齐,Vector 学习更轻松!
第十四幕:什么时候使用Vector?
老师问:
下面这些情况。
应该选择数组。
还是Vector?
情况一
一年级有50名学生。
永远都是50人。
答案:
数组。
情况二
今天来了多少游客。
不知道。
答案:
Vector。
情况三
保存比赛成绩。
人数不断增加。
答案:
Vector。
情况四
保存棋盘:
19×19固定大小。
答案:
数组。
不是Vector一定比数组好,而是要根据问题选择工具。
总结
今天,我们认识了 STL 中最常用的容器——Vector(动态数组)。
它最大的特点是:
大小可以自动增长。
使用方式和数组非常相似。
支持下标访问。
可以方便地在末尾添加和删除元素。
今天学会了 7 个最常用的成员函数:
| 成员函数 | 作用 | 生活中的理解 |
|---|---|---|
push_back(x) | 在最后放入一个元素 | 往盒子里放一个新玩具 |
pop_back() | 删除最后一个元素 | 拿走最后放进去的玩具 |
size() | 元素个数 | 数一数盒子里有几个玩具 |
empty() | 是否为空 | 看看盒子是不是空的 |
clear() | 清空所有元素 | 把盒子里的东西全部倒出来 |
front() | 第一个元素 | 看盒子最前面的玩具 |
back() | 最后一个元素 | 看盒子最后放进去的玩具 |
记忆口诀:
数组大小先定好,Vector 长大不用愁;
后面放用push_back(),最后删除pop_back();size()数数量,empty()看空忙;front()看最前,back()看最后,学会 Vector 真顺手!