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

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

相关推荐
栗子~~2 分钟前
hardhat 单元测试时如何观察gas消耗情况
开发语言·单元测试·区块链·智能合约
The hopes of the whole village4 分钟前
Matlab FFT分析
开发语言·matlab
兰文彬12 分钟前
n8n 2.x版本没有内嵌Python环境
开发语言·python
yiyaozjk15 分钟前
Go基础之环境搭建
开发语言·后端·golang
谁动了我的代码?21 分钟前
VNC中使用QT的GDB调试,触发断点时与界面窗口交互导致整个VNC冻结
开发语言·qt·svn
We་ct30 分钟前
LeetCode 212. 单词搜索 II:Trie+DFS 高效解法
开发语言·算法·leetcode·typescript·深度优先·图搜索算法·图搜索
样例过了就是过了33 分钟前
LeetCode热题100 路径总和 III
数据结构·c++·算法·leetcode·链表
OxyTheCrack35 分钟前
【C++】简述main函数中的argc与argv
开发语言·c++
历程里程碑42 分钟前
Linux 49 HTTP请求与响应实战解析 带http模拟实现源码--万字长文解析
java·开发语言·网络·c++·网络协议·http·排序算法
ZVAyIVqt0UFji43 分钟前
高可用虚拟IP(HaVip)技术详解:原理、设计与应用
开发语言·网络·网络协议·tcp/ip·perl