当前位置: 首页 > news >正文

《C++ STL 基础入门》教案

一、教学目标

  1. 了解 STL 中 5 种常用容器(vector、string、queue、stack)和 sort 算法的基本功能
  2. 掌握各容器的核心操作(添加、访问、删除元素)
  3. 能通过生活场景理解容器特性(如队列 "先进先出"、栈 "后进先出")
  4. 会用简单代码实现容器的基本功能

二、重点与难点

重点

  1. 各容器的特性:
    • vector:动态数组,可随机访问(像 "自动变大的书包")
    • string:字符串容器,支持拼接和长度计算(像 "装文字的盒子")
    • queue:队列,先进先出(像 "排队打饭")
    • stack:栈,后进先出(像 "叠书")
    • sort:排序算法,默认从小到大排序(像 "按身高排队")
  2. 核心操作函数:
    • vector:push_back()(添加)、size()(长度)、[i](访问)
    • string:+(拼接)、size()(长度)
    • queue:push()(入队)、front()(队头)、pop()(出队)、empty()(判空)
    • stack:push()(入栈)、top()(栈顶)、pop()(出栈)、empty()(判空)
    • sort:sort(开始, 结束)(排序)

难点

  1. 队列与栈的区别(先进先出 vs 后进先出)
  2. 容器操作的顺序(如 queue 不能直接访问中间元素,只能从队头取)
  3. 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 道)

  1. 在 C++ 中,使用 vector 需要包含的头文件是_______。答案:<vector>解析:STL 容器需要包含对应的头文件,vector 的头文件是<vector>

  2. 向 vector 中添加元素的函数是_______。答案:push_back()解析:push_back(值)用于在 vector 末尾添加元素,类似 "往书包里放东西"。

  3. 要获取 string 的长度,应使用_______函数。答案:size()解析:string变量.size()返回字符串的长度(字符个数)。

  4. 队列(queue)中,获取队头元素的函数是_______。答案:front()解析:queue 是 "排队" 结构,front()用于查看队伍最前面的元素。

  5. 栈(stack)中,移除栈顶元素的函数是_______。答案:pop()解析:pop()用于删除栈顶元素(最上面的元素),注意该函数没有返回值。

  6. 若要使用 sort 算法,需要包含的头文件是_______。答案:<algorithm>解析:sort 是 STL 算法,定义在<algorithm>头文件中。

  7. 对于 vector<int> nums,排序时需调用的函数是_______。答案:sort(nums.begin(), nums.end())解析:begin()表示容器的起始位置,end()表示结束位置,sort 会对这个范围内的元素排序。

  8. 队列的特性是_______(填 "先进先出" 或 "后进先出")。答案:先进先出解析:队列类似排队,先到的人先处理,即 "先进先出"。

  9. 栈的特性是_______(填 "先进先出" 或 "后进先出")。答案:后进先出解析:栈类似叠书,最后放的书在最上面,先被拿走,即 "后进先出"。

  10. 执行string a = "abc"; string b = "def"; string c = a + b;后,c 的值是_______。答案:"abcdef"解析:string 支持+运算符,用于拼接两个字符串。

二、选择题(10 道)

  1. 下列哪个容器可以像普通数组一样用[i]访问元素?( )A. queue B. stack C. vector D. 以上都可以答案:C解析:vector 是动态数组,支持随机访问(用[i]访问第 i 个元素);queue 和 stack 不能直接用[i]访问。

  2. 下列哪个函数用于判断队列是否为空?( )A. empty() B. size() C. clear() D. isEmpty()答案:A解析:queue 的empty()函数返回 true 表示队列空,false 表示非空。

  3. 对于 stack<string> s,若要查看栈顶元素(不删除),应使用( )A. s.front() B. s.top() C. s.back() D. s.pop()答案:B解析:stack 用top()获取栈顶元素,front()是 queue 的函数,pop()用于删除元素。

  4. 执行以下代码后,输出结果是( )

    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。

  5. 下列关于 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 越界。

  6. 执行以下代码后,输出结果是( )

    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。

  7. 执行以下代码后,输出结果是( )

    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。

  8. 对 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 默认按从小到大排序。

  9. 下列哪个容器的元素不能被随机访问(即不能直接访问第 i 个元素)?( )A. vector B. string C. queue D. 以上都能答案:C解析:queue 只能访问队头元素,不能直接访问中间元素。

  10. 下列代码的输出结果是( )

    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 道)

  1. 用 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。

  2. 用 string 存储一个名字,输出 "Hello, 名字!"(例如名字是 "张三",输出 "Hello, 张三!")。参考代码:

    cpp

    运行

    #include <iostream>
    #include <string>
    using namespace std;int main() {string name = "张三";cout << "Hello, " + name + "!" << endl; // 输出Hello, 张三!return 0;
    }
    

    答案:Hello, 张三!解析:用+拼接字符串。

  3. 用 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

    甲点完餐了
    乙点完餐了
    丙点完餐了
    

    解析:队列先进先出,按添加顺序输出。

  4. 用 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

    拿走了绿盘子
    拿走了蓝盘子
    拿走了红盘子
    

    解析:栈后进先出,最后添加的绿盘子先被拿走。

  5. 用 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 将元素从小到大排序。

  6. 统计 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。

  7. 向 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。

  8. 用 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 号"。

  9. 用 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;
    }
    

    输出:尺子 橡皮 铅笔解析:栈后进先出,最后添加的 "尺子" 先被取出。

  10. 对 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 模拟叠杯子)巩固知识点。

http://www.dtcms.com/a/499214.html

相关文章:

  • 基于对数灰关联度的IOWGA算子最优组合预测模型
  • VGW 技术解析:构建 Windows 平台的虚拟路由网关中枢
  • 内容安全优化:基于Redis实现分级反爬虫策略
  • 生成式设计案例:MG AEC利用Autodesk AEC Collection推进可持续建筑设计
  • 物流网站源代码修改wordpress后台文字
  • 【HTML】网络数据是如何渲染成HTML网页页面显示的
  • 做门图网站产品品牌推广公司
  • linux学习笔记(38)mysql索引详解
  • M1安装RocketMQ消息队列
  • 广西壮族自治区住房和城乡建设厅网站网站内页制作
  • PDFium导出pdf 图像
  • C++11标准 上 (万字解析)
  • Java基础语法—字面量、变量详解、存储数据原理
  • 手工视频制作网站移动网站建设初学视频教程
  • 【shell】每日shell练习(系统服务状态监控/系统性能瓶颈分析)
  • Swift 下标脚本
  • Spring Boot 3零基础教程,WEB 开发 默认页签图标 Favicon 笔记28
  • php 网站部署杭州企业自助建站系统
  • IntelliJ IDEA 2023中为 Spring Boot 项目添加注释模板
  • Java Web安全防护:SQL注入、XSS攻击的预防与处理
  • leetcode 912.排序数组
  • 个人网站可以做商城吗seo三人行网站
  • 第3讲:Go垃圾回收机制与性能优化
  • Mac 桌面动态壁纸软件|Live Wallpaper 4K Pro v19.7 安装包使用教程(附安装包)
  • 简易网站开发网站建设的各个环节
  • 用 Selenium 搞定动态网页:模拟点击、滚动、登录全流程
  • VBA数据结构抉择战:Dictionary与Collection谁才是效率王者?
  • macos虚拟机-演示篇三配置clover引导
  • 【小白笔记】岛屿的周长(Island Perimeter)
  • 【C# OOP 入门到精通】从基础概念到 MVC 实战(含 SOLID 原则与完整代码)