《C++ STL 基础入门》教案
一、教学目标
- 了解 STL 中 5 种常用容器(vector、string、queue、stack)和 sort 算法的基本功能
- 掌握各容器的核心操作(添加、访问、删除元素)
- 能通过生活场景理解容器特性(如队列 "先进先出"、栈 "后进先出")
- 会用简单代码实现容器的基本功能
二、重点与难点
重点
- 各容器的特性:
- vector:动态数组,可随机访问(像 "自动变大的书包")
- string:字符串容器,支持拼接和长度计算(像 "装文字的盒子")
- queue:队列,先进先出(像 "排队打饭")
- stack:栈,后进先出(像 "叠书")
- sort:排序算法,默认从小到大排序(像 "按身高排队")
- 核心操作函数:
- vector:
push_back()
(添加)、size()
(长度)、[i]
(访问) - string:
+
(拼接)、size()
(长度) - queue:
push()
(入队)、front()
(队头)、pop()
(出队)、empty()
(判空) - stack:
push()
(入栈)、top()
(栈顶)、pop()
(出栈)、empty()
(判空) - sort:
sort(开始, 结束)
(排序)
- vector:
难点
- 队列与栈的区别(先进先出 vs 后进先出)
- 容器操作的顺序(如 queue 不能直接访问中间元素,只能从队头取)
- sort 算法的参数(
begin()
和end()
的含义)
三、例题讲解(见原示例代码)
一、vector(动态数组:像 “可以自动变大的书包”)
功能:存放一系列相同类型的东西,不够装时会自动扩容。例子:用 vector 存几个小朋友的年龄,然后输出。
cpp
运行
#include <iostream>
#include <vector> // 包含 vector 头文件
using namespace std;int main() {// 定义一个“装整数的书包”,名叫 agesvector<int> ages;// 往书包里放东西(年龄)ages.push_back(8); // 放 8 岁ages.push_back(9); // 放 9 岁ages.push_back(7); // 放 7 岁// 看看书包里有多少东西cout << "共有 " << ages.size() << " 个年龄:" << endl;// 把书包里的东西一个个拿出来看for (int i = 0; i < ages.size(); i++) {cout << "第" << i+1 << "个:" << ages[i] << "岁" << endl;}return 0;
}
#include <iostream>
#include <vector> // 包含 vector 头文件
using namespace std;int main() {// 定义一个“装整数的书包”,名叫 仔仔包vector<string> book;// 往书包里书本book.push_back("数学"); // 放 8 岁// 看看书包里有多少东西cout << "共有 " << book.size() << " 本书:" << endl;return 0;
}
输出:
plaintext
共有 3 个年龄:
第1个:8岁
第2个:9岁
第3个:7岁
二、string(字符串:像 “装文字的盒子”)
功能:存放一串字符(文字),可以直接拼接、比较。例子:用 string 存名字,拼接成一句话。
cpp
运行
#include <iostream>
#include <string> // 包含 string 头文件
using namespace std;int main() {// 定义两个装文字的盒子string name1 = "小明";string name2 = "小红";// 把两个盒子的文字拼起来string sentence = name1 + "和" + name2 + "是好朋友";// 输出结果cout << sentence << endl;// 还能看文字的长度(有几个字)cout << name1 << "有" << name1.size() << "个字" << endl;return 0;
}
输出:
plaintext
小明和小红是好朋友
小明有2个字
三、queue(队列:像 “排队打饭”,先进先出)
功能:只能从后面加东西,从前面拿东西(先到先得)。例子:模拟小朋友排队买冰淇淋。
cpp
运行
#include <iostream>
#include <queue> // 包含 queue 头文件
using namespace std;int main() {// 定义一个“队伍”,装小朋友的名字queue<string> q;// 小朋友来排队(从队尾加入)q.push("小刚");q.push("小丽");q.push("小芳");cout << "排队顺序:" << endl;// 直到队伍空了为止while (!q.empty()) { // empty() 检查队伍是否空了// 第一个人买完走了(从队头拿走)cout << q.front() << "买到冰淇淋啦!" << endl; // front() 看队头q.pop(); // 移除队头的人}return 0;
}
输出:
plaintext
排队顺序:
小刚买到冰淇淋啦!
小丽买到冰淇淋啦!
小芳买到冰淇淋啦!
四、stack(栈:像 “叠书”,后进先出)
功能:只能从上面放东西,从上面拿东西(最后放的先拿)。例子:模拟叠书和取书。
cpp
运行
#include <iostream>
#include <stack> // 包含 stack 头文件
using namespace std;int main() {// 定义一个“书堆”stack<string> books;// 往书堆上放书books.push("语文书");books.push("数学书");books.push("英语书"); // 最后放的在最上面cout << "取书顺序:" << endl;// 直到书堆空了为止while (!books.empty()) {// 拿走最上面的书cout << "拿到了:" << books.top() << endl; // top() 看最上面books.pop(); // 移除最上面的书}return 0;
}
输出:
plaintext
取书顺序:
拿到了:英语书
拿到了:数学书
拿到了:语文书
五、sort 算法(排序:像 “按身高排队”)
功能:把一串数字或文字按顺序排好(从小到大)。例子:给几个数字排序。
cpp
运行
#include <iostream>
#include <vector>
#include <algorithm> // 包含 sort 头文件
using namespace std;int main() {// 定义一个装数字的数组vector<int> nums = {5, 2, 7, 1, 3};cout << "排序前:";for (int n : nums) { // 简化的循环写法(遍历每个元素)cout << n << " ";}// 排序(自动从小到大)sort(nums.begin(), nums.end());cout << "\n排序后:";for (int n : nums) {cout << n << " ";}return 0;
}
输出:
plaintext
排序前:5 2 7 1 3
排序后:1 2 3 5 7
通过生活场景类比 + 代码演示,讲解 vector、string、queue、stack 的用法和 sort 算法的应用。
四、练习题
一、填空题(10 道)
-
在 C++ 中,使用 vector 需要包含的头文件是_______。答案:
<vector>
解析:STL 容器需要包含对应的头文件,vector 的头文件是<vector>
。 -
向 vector 中添加元素的函数是_______。答案:
push_back()
解析:push_back(值)
用于在 vector 末尾添加元素,类似 "往书包里放东西"。 -
要获取 string 的长度,应使用_______函数。答案:
size()
解析:string变量.size()
返回字符串的长度(字符个数)。 -
队列(queue)中,获取队头元素的函数是_______。答案:
front()
解析:queue 是 "排队" 结构,front()
用于查看队伍最前面的元素。 -
栈(stack)中,移除栈顶元素的函数是_______。答案:
pop()
解析:pop()
用于删除栈顶元素(最上面的元素),注意该函数没有返回值。 -
若要使用 sort 算法,需要包含的头文件是_______。答案:
<algorithm>
解析:sort 是 STL 算法,定义在<algorithm>
头文件中。 -
对于 vector<int> nums,排序时需调用的函数是_______。答案:
sort(nums.begin(), nums.end())
解析:begin()
表示容器的起始位置,end()
表示结束位置,sort 会对这个范围内的元素排序。 -
队列的特性是_______(填 "先进先出" 或 "后进先出")。答案:先进先出解析:队列类似排队,先到的人先处理,即 "先进先出"。
-
栈的特性是_______(填 "先进先出" 或 "后进先出")。答案:后进先出解析:栈类似叠书,最后放的书在最上面,先被拿走,即 "后进先出"。
-
执行
string a = "abc"; string b = "def"; string c = a + b;
后,c 的值是_______。答案:"abcdef"
解析:string 支持+
运算符,用于拼接两个字符串。
二、选择题(10 道)
-
下列哪个容器可以像普通数组一样用
[i]
访问元素?( )A. queue B. stack C. vector D. 以上都可以答案:C解析:vector 是动态数组,支持随机访问(用[i]
访问第 i 个元素);queue 和 stack 不能直接用[i]
访问。 -
下列哪个函数用于判断队列是否为空?( )A.
empty()
B.size()
C.clear()
D.isEmpty()
答案:A解析:queue 的empty()
函数返回 true 表示队列空,false 表示非空。 -
对于 stack<string> s,若要查看栈顶元素(不删除),应使用( )A.
s.front()
B.s.top()
C.s.back()
D.s.pop()
答案:B解析:stack 用top()
获取栈顶元素,front()
是 queue 的函数,pop()
用于删除元素。 -
执行以下代码后,输出结果是( )
cpp
运行
vector<int> v; v.push_back(3); v.push_back(1); v.push_back(2); cout << v[1];
A. 3 B. 1 C. 2 D. 0答案:B解析:vector 的元素按添加顺序存储,索引从 0 开始,
v[1]
是第二个元素 1。 -
下列关于 string 的操作,正确的是( )A.
string s = "a" + "b";
B.string s; s = "abc" + 123;
C.string s = "hello"; s.size()
D.string s = "hi"; s[2] = '!';
答案:C解析:A 中两个字符串常量不能直接用+
;B 中字符串和数字不能直接拼接;C 正确,size()
返回长度;D 中 "s" 长度为 2,索引 2 越界。 -
执行以下代码后,输出结果是( )
cpp
运行
queue<int> q; q.push(10); q.push(20); q.pop(); cout << q.front();
A. 10 B. 20 C. 0 D. 无输出答案:B解析:先入队 10 和 20,
pop()
删除队头 10,剩余队头是 20。 -
执行以下代码后,输出结果是( )
cpp
运行
stack<int> s; s.push(5); s.push(6); s.pop(); cout << s.top();
A. 5 B. 6 C. 0 D. 无输出答案:A解析:先入栈 5 和 6(6 在栈顶),
pop()
删除 6,栈顶剩余 5。 -
对 vector<int> nums = {4,2,5,1} 使用 sort 排序后,结果是( )A. {1,2,4,5} B. {5,4,2,1} C. {4,5,2,1} D. 不变答案:A解析:sort 默认按从小到大排序。
-
下列哪个容器的元素不能被随机访问(即不能直接访问第 i 个元素)?( )A. vector B. string C. queue D. 以上都能答案:C解析:queue 只能访问队头元素,不能直接访问中间元素。
-
下列代码的输出结果是( )
cpp
运行
string a = "cat"; string b = "dog"; cout << (a + b).size();
A. 3 B. 6 C. 5 D. 0答案:B解析:
a + b
是 "catdog",长度为 6。
三、编程题(10 道)
-
用 vector 存储 3 个同学的体重(整数),并输出所有体重的总和。参考代码:
cpp
运行
#include <iostream> #include <vector> using namespace std;int main() {vector<int> weights;weights.push_back(30);weights.push_back(35);weights.push_back(28);int sum = 0;for (int i = 0; i < weights.size(); i++) {sum += weights[i];}cout << sum << endl; // 输出93return 0; }
答案:93解析:将 3 个元素相加,30+35+28=93。
-
用 string 存储一个名字,输出 "Hello, 名字!"(例如名字是 "张三",输出 "Hello, 张三!")。参考代码:
cpp
运行
#include <iostream> #include <string> using namespace std;int main() {string name = "张三";cout << "Hello, " + name + "!" << endl; // 输出Hello, 张三!return 0; }
答案:Hello, 张三!解析:用
+
拼接字符串。 -
用 queue 模拟 3 个顾客点餐,依次输出 "XX 点完餐了"。参考代码:
cpp
运行
#include <iostream> #include <queue> using namespace std;int main() {queue<string> customers;customers.push("甲");customers.push("乙");customers.push("丙");while (!customers.empty()) {cout << customers.front() << "点完餐了" << endl;customers.pop();}return 0; }
输出:
plaintext
甲点完餐了 乙点完餐了 丙点完餐了
解析:队列先进先出,按添加顺序输出。
-
用 stack 模拟 3 个盘子叠放,依次输出 "拿走了 XX 盘子"。参考代码:
cpp
运行
#include <iostream> #include <stack> using namespace std;int main() {stack<string> plates;plates.push("红盘子");plates.push("蓝盘子");plates.push("绿盘子");while (!plates.empty()) {cout << "拿走了" << plates.top() << endl;plates.pop();}return 0; }
输出:
plaintext
拿走了绿盘子 拿走了蓝盘子 拿走了红盘子
解析:栈后进先出,最后添加的绿盘子先被拿走。
-
用 vector 存储 5 个整数 {3,1,4,2,5},排序后输出。参考代码:
cpp
运行
#include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {vector<int> nums = {3,1,4,2,5};sort(nums.begin(), nums.end());for (int n : nums) {cout << n << " ";}return 0; }
输出:
1 2 3 4 5
解析:sort 将元素从小到大排序。 -
统计 string"apple" 的长度,并输出。参考代码:
cpp
运行
#include <iostream> #include <string> using namespace std;int main() {string s = "apple";cout << s.size() << endl; // 输出5return 0; }
答案:5解析:"apple" 有 5 个字符,
size()
返回 5。 -
向 vector 中添加 2、4、6,然后输出第 2 个元素(索引从 0 开始)。参考代码:
cpp
运行
#include <iostream> #include <vector> using namespace std;int main() {vector<int> v;v.push_back(2);v.push_back(4);v.push_back(6);cout << v[1] << endl; // 输出4return 0; }
答案:4解析:索引 1 对应第二个元素 4。
-
用 queue 存储 "1 号"、"2 号"、"3 号",删除队头后输出新的队头。参考代码:
cpp
运行
#include <iostream> #include <queue> using namespace std;int main() {queue<string> q;q.push("1号");q.push("2号");q.push("3号");q.pop(); // 删除1号cout << q.front() << endl; // 输出2号return 0; }
答案:2 号解析:删除队头 "1 号" 后,新队头是 "2 号"。
-
用 stack 存储 "铅笔"、"橡皮",再添加 "尺子",然后依次取出并输出。参考代码:
cpp
运行
#include <iostream> #include <stack> using namespace std;int main() {stack<string> s;s.push("铅笔");s.push("橡皮");s.push("尺子");while (!s.empty()) {cout << s.top() << " ";s.pop();}return 0; }
输出:
尺子 橡皮 铅笔
解析:栈后进先出,最后添加的 "尺子" 先被取出。 -
对 string 数组 {"banana", "apple", "cherry"} 排序后输出。参考代码:
cpp
运行
#include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {vector<string> fruits = {"banana", "apple", "cherry"};sort(fruits.begin(), fruits.end());for (string f : fruits) {cout << f << " ";}return 0; }
输出:
apple banana cherry
解析:sort 对字符串按字典序(类似拼音顺序)排序。
五、总结
本课时通过生活场景类比,学习了 STL 中 5 种常用工具的基本用法。重点在于理解各容器的特性和核心操作,课后可通过更多生活案例练习(如用 queue 模拟银行叫号、用 stack 模拟叠杯子)巩固知识点。