第九章: 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 算法极大简化排序、查找和统计操作。

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

相关推荐
学涯乐码堂主11 分钟前
有趣的“打擂台算法”
c++·算法·青少年编程·gesp
云栖梦泽1 小时前
Linux内核与驱动:14.SPI子系统
linux·运维·服务器·c++
Gary Studio1 小时前
安卓HAL C++基础-智能指针
开发语言·c++
还是阿落呀1 小时前
基本控制结构2
c++
啧不应该啊1 小时前
Day1 Python 与 C 的类型区别
c语言·开发语言
多思考少编码2 小时前
PAT甲级真题1001 - 1005题详细题解(C++)(个人题解)
c++·python·最短路·pat·算法竞赛
cen__y2 小时前
Linux07(信号01)
linux·运维·服务器·c语言·开发语言
xingpanvip2 小时前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua
guygg882 小时前
基于遗传算法的双层规划模型求解MATLAB实现
开发语言·matlab
凯瑟琳.奥古斯特3 小时前
SQLAlchemy核心功能解析
开发语言·python·flask