《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() {
    // 定义一个"装整数的书包",名叫 ages
    vector<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;
}
cpp 复制代码
#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; // 输出93
        return 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; // 输出5
        return 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; // 输出4
        return 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 模拟叠杯子)巩固知识点。

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔1 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说7 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json