第九章: STL 容器基础(C++)

目录

[1. 序列容器](#1. 序列容器)

[2. 关联容器](#2. 关联容器)

[3. 迭代器](#3. 迭代器)

[4. 常用算法](#4. 常用算法)

[5. 案例:学生成绩管理](#5. 案例:学生成绩管理)

总结


在 C++ 中,STL(Standard Template Library,标准模板库)提供了丰富的容器、算法和迭代器,用于高效管理和操作数据。本章将介绍序列容器、关联容器、迭代器以及常用算法,并通过一个案例展示如何使用它们管理学生成绩。


1. 序列容器

序列容器(Sequence Containers)是按线性顺序存储元素的容器,常见的有:

  • vector:动态数组,支持快速随机访问,末尾插入删除高效。

  • deque:双端队列,支持两端快速插入和删除。

  • list:双向链表,支持任意位置快速插入和删除,但不支持随机访问。

示例代码:

cpp 复制代码
#include <iostream>
#include <vector>
#include <deque>
#include <list>

int main() {
    // vector
    std::vector<int> vec = {1, 2, 3};
    vec.push_back(4);  // 在末尾插入
    std::cout << "Vector: ";
    for (int v : vec) std::cout << v << " ";
    std::cout << std::endl;

    // deque
    std::deque<int> deq = {10, 20};
    deq.push_front(5);  // 在前面插入
    deq.push_back(25);  // 在后面插入
    std::cout << "Deque: ";
    for (int d : deq) std::cout << d << " ";
    std::cout << std::endl;

    // list
    std::list<int> lst = {100, 200, 300};
    lst.push_back(400);
    lst.push_front(50);
    std::cout << "List: ";
    for (int l : lst) std::cout << l << " ";
    std::cout << std::endl;

    return 0;
}

2. 关联容器

关联容器(Associative Containers)按照特定顺序存储元素,提供快速查找功能。常见有:

  • map:键值对容器,键唯一,有序。

  • set:集合,元素唯一,有序。

  • unordered_map:键值对容器,键唯一,无序,查找效率高。

  • unordered_set:集合,元素唯一,无序。

示例代码:

cpp 复制代码
#include <iostream>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>

int main() {
    // map
    std::map<std::string, int> scores;
    scores["Alice"] = 95;
    scores["Bob"] = 88;

    std::cout << "Map: ";
    for (auto &[name, score] : scores)
        std::cout << name << ":" << score << " ";
    std::cout << std::endl;

    // set
    std::set<int> s = {5, 3, 7, 5};  // 自动去重
    std::cout << "Set: ";
    for (int x : s) std::cout << x << " ";
    std::cout << std::endl;

    // unordered_map
    std::unordered_map<std::string, int> umap;
    umap["Charlie"] = 70;
    umap["David"] = 85;

    // unordered_set
    std::unordered_set<int> uset = {10, 20, 10, 30};

    return 0;
}

3. 迭代器

迭代器(Iterator)是 STL 的通用指针概念,用于遍历容器。

常用方法:

  • begin():指向容器首元素

  • end():指向容器尾后位置(不包含元素)

示例代码:

cpp 复制代码
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::cout << "Vector elements: ";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        std::cout << *it << " ";  // 使用迭代器访问元素
    std::cout << std::endl;
}

4. 常用算法

STL 提供丰富的算法,常用的有:

  • sort(begin, end):排序

  • find(begin, end, value):查找元素

  • count(begin, end, value):统计元素出现次数

示例代码:

cpp 复制代码
#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> vec = {4, 1, 3, 2, 3};
    
    // 排序
    std::sort(vec.begin(), vec.end());
    std::cout << "Sorted vector: ";
    for (int v : vec) std::cout << v << " ";
    std::cout << std::endl;

    // 查找
    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end())
        std::cout << "Found 3 at position: " << (it - vec.begin()) << std::endl;

    // 统计
    int cnt = std::count(vec.begin(), vec.end(), 3);
    std::cout << "Number of 3s: " << cnt << std::endl;

    return 0;
}

5. 案例:学生成绩管理

目标 :用 map 存储学生姓名和成绩,并进行成绩排序和查找。

cpp 复制代码
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

int main() {
    std::map<std::string, int> students = {
        {"Alice", 95},
        {"Bob", 88},
        {"Charlie", 70},
        {"David", 85}
    };

    // 将 map 转换为 vector 方便排序
    std::vector<std::pair<std::string, int>> vec(students.begin(), students.end());
    
    // 按成绩降序排序
    std::sort(vec.begin(), vec.end(), [](auto &a, auto &b) { return a.second > b.second; });

    std::cout << "Students sorted by score:" << std::endl;
    for (auto &[name, score] : vec)
        std::cout << name << ": " << score << std::endl;

    // 查找成绩大于 80 的学生
    std::cout << "Students with score > 80:" << std::endl;
    for (auto &[name, score] : vec)
        if (score > 80) std::cout << name << ": " << score << std::endl;

    return 0;
}

运行效果

cpp 复制代码
Students sorted by score:
Alice: 95
Bob: 88
David: 85
Charlie: 70

Students with score > 80:
Alice: 95
Bob: 88
David: 85

总结

  • 序列容器适合按顺序存储数据。

  • 关联容器适合快速查找和去重。

  • 迭代器是访问容器的通用方式。

  • STL 算法极大简化排序、查找和统计操作。

  • 将容器与算法结合,可高效实现复杂的数据管理任务,例如学生成绩管理。

相关推荐
自信150413057592 分钟前
重生之从0开始学习c++之类与对象(中)
c++·学习
ths5125 分钟前
测试开发python中正则表达式使用总结(二)
开发语言·python·算法
色空大师6 分钟前
【java打包方式详解】
java·开发语言·部署·打包·启动脚本·jar包分离
人道领域6 分钟前
2026年Java后端热点全景解析:从LTS革新到云原生跃迁
java·开发语言
heimeiyingwang6 分钟前
【架构实战】API接口防刷与限流策略
开发语言·python·架构
188号安全攻城狮8 分钟前
【前端基础知识】JavaScript 数组方法总结:从表格速查到分类详解
开发语言·前端·javascript·网络安全
不爱吃炸鸡柳9 分钟前
5道经典贪心算法题详解:从入门到进阶
开发语言·数据结构·c++·算法·贪心算法
智者知已应修善业18 分钟前
【51单片机1,左边4个LED灯先闪烁2次后,右边4个LED灯再闪烁2次:2,接着所用灯一起闪烁3次,接着重复步骤1,如此循环。】2023-5-19
c++·经验分享·笔记·算法·51单片机
xyq202418 分钟前
Java 变量命名规则
开发语言
天启HTTP19 分钟前
HTTP代理和隧道代理的底层区别与适用场景分析
开发语言·网络协议·tcp/ip·php