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

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

相关推荐
陳10305 分钟前
C++:红黑树
开发语言·c++
一切尽在,你来10 分钟前
C++ 零基础教程 - 第 6 讲 常用运算符教程
开发语言·c++
泉-java12 分钟前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
weixin_4997715531 分钟前
C++中的组合模式
开发语言·c++·算法
初级代码游戏32 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau35 分钟前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
2的n次方_1 小时前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
近津薪荼1 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck1 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
_F_y1 小时前
C++重点知识总结
java·jvm·c++