侯捷 C++ 课程学习笔记:STL 容器的结构与分类(附测试案例代码)

embedded/2025/2/27 11:18:45/
一、容器的分类与结构

在 C++ 标准模板库(STL)中,容器(Containers)是用于存储和管理数据的重要组件。根据数据的组织方式和访问特性,容器可以分为以下几类:

  1. 序列容器(Sequence Containers)

    • Array:固定大小的数组,元素在内存中连续存储。
    • Vector:动态数组,可以自动调整大小,支持随机访问。
    • Deque:双端队列,支持在两端进行插入和删除操作。
    • List:双向链表,支持在任意位置进行插入和删除操作。
    • Forward-List:单向链表,支持在任意位置进行插入和删除操作,但只能单向遍历。
  2. 关联容器(Associative Containers)

    • Set/Multiset:集合,存储唯一的键值,按键值排序。
    • Map/Multimap:映射,存储键值对,按键值排序。
  3. 无序容器(Unordered Containers)

    • Unordered Set/Multiset:无序集合,存储唯一的键值,不按键值排序。
    • Unordered Map/Multimap:无序映射,存储键值对,不按键值排序。
二、容器的内部结构
  1. 序列容器

    • Array:固定大小的数组,元素在内存中连续存储。
    • Vector:动态数组,内部使用连续的内存空间,通过指针和容量管理来实现动态调整。
    • Deque:双端队列,内部使用多个连续的内存块,支持在两端进行插入和删除操作。
    • List:双向链表,每个节点包含数据和前后指针,支持在任意位置进行插入和删除操作。
    • Forward-List:单向链表,每个节点包含数据和后指针,支持在任意位置进行插入和删除操作,但只能单向遍历。
  2. 关联容器

    • Set/Multiset:内部使用平衡二叉搜索树(如红黑树),按键值排序,支持快速的查找、插入和删除操作。
    • Map/Multimap:内部使用平衡二叉搜索树,按键值排序,支持快速的查找、插入和删除操作,存储键值对。
  3. 无序容器

    • Unordered Set/Multiset:内部使用哈希表,通过哈希函数将键值映射到哈希表的槽位,支持快速的查找、插入和删除操作。
    • Unordered Map/Multimap:内部使用哈希表,通过哈希函数将键值映射到哈希表的槽位,支持快速的查找、插入和删除操作,存储键值对。
三、测试案例代码
1. 序列容器测试案例

Vector 测试案例:

#include <iostream>
#include <vector>int main() {std::vector<int> vec;// 添加元素vec.push_back(10);vec.push_back(20);vec.push_back(30);// 访问元素std::cout << "vec[0]: " << vec[0] << std::endl;std::cout << "vec[1]: " << vec[1] << std::endl;std::cout << "vec[2]: " << vec[2] << std::endl;// 删除元素vec.erase(vec.begin() + 1);// 遍历for (int i : vec) {std::cout << i << " ";}return 0;
}

List 测试案例:

#include <iostream>
#include <list>int main() {std::list<int> lst;// 添加元素lst.push_back(10);lst.push_front(20);// 删除元素lst.remove(10);// 遍历for (int i : lst) {std::cout << i << " ";}return 0;
}
2. 关联容器测试案例

Set 测试案例:

#include <iostream>
#include <set>int main() {std::set<int> s;// 插入元素s.insert(10);s.insert(20);s.insert(30);// 查找元素auto it = s.find(20);if (it != s.end()) {std::cout << "Found: " << *it << std::endl;}// 删除元素s.erase(20);// 遍历for (int i : s) {std::cout << i << " ";}return 0;
}

Map 测试案例:

#include <iostream>
#include <map>int main() {std::map<int, std::string> m;// 插入键值对m[1] = "one";m[2] = "two";m[3] = "three";// 查找键值对auto it = m.find(2);if (it != m.end()) {std::cout << "Found: " << it->first << " -> " << it->second << std::endl;}// 删除键值对m.erase(2);// 遍历for (auto const& pair : m) {std::cout << pair.first << " -> " << pair.second << std::endl;}return 0;
}
3. 无序容器测试案例

Unordered Set 测试案例:

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> us;// 插入元素us.insert(10);us.insert(20);us.insert(30);// 查找元素auto it = us.find(20);if (it != us.end()) {std::cout << "Found: " << *it << std::endl;}// 删除元素us.erase(20);// 遍历for (int i : us) {std::cout << i << " ";}return 0;
}

Unordered Map 测试案例:

#include <iostream>
#include <unordered_map>int main() {std::unordered_map<int, std::string> um;// 插入键值对um[1] = "one";um[2] = "two";um[3] = "three";// 查找键值对auto it = um.find(2);if (it != um.end()) {std::cout << "Found: " << it->first << " -> " << it->second << std::endl;}// 删除键值对um.erase(2);// 遍历for (auto const& pair : um) {std::cout << pair.first << " -> " << pair.second << std::endl;}return 0;
}
四、学习心得

通过学习,我对 STL 容器的结构与分类有了更深入的理解。掌握了STL 容器的核心概念和应用技巧。特别是通过实际的测试案例代码,我更好地理解了每种容器的特性和使用方法。

在实际编程中,合理选择和使用 STL 容器可以显著提高代码的可读性和可维护性。例如,对于需要频繁插入和删除操作的场景,可以选择 listforward_list;对于需要快速查找和排序的场景,可以选择 setmap;对于需要快速查找但不关心顺序的场景,可以选择 unordered_setunordered_map

在未来的学习和工作中,我将继续深入探索 STL 容器的高级特性,并将其应用到实际项目中,以提升自己的编程能力。


http://www.ppmy.cn/embedded/167513.html

相关文章

模拟算法.

一、引言&#xff1a; 模拟算法&#xff0c;简单来说&#xff0c;就是按照题目描述的步骤或规则&#xff0c;一步一步地用代码实现解决问题的过程。就像是你在玩一个游戏&#xff0c;游戏有它自己的规则&#xff0c;而你需要根据这些规则来做出相应的动作以完成特定的目标。 …

Git 安装配置

Git 安装配置 引言 Git,作为世界上最流行的版本控制系统之一,广泛应用于软件开发、文档管理等多个领域。本文将详细介绍Git的安装与配置过程,帮助读者快速上手,高效使用Git进行版本控制。 Git 安装 Windows 系统安装 访问Git官网:首先,访问Git官网(https://git-scm.…

seacmsv9报错注入

1、seacms的介绍 ​ seacms中文名&#xff1a;海洋影视管理系统。是一个采用了php5mysql架构的影视网站框架&#xff0c;因此&#xff0c;如果该框架有漏洞&#xff0c;那使用了该框架的各个网站都会有相同问题。 2、源码的分析 漏洞的部分源码如下&#xff1a; <?php …

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强&#xff0c;医院就诊量逐年增加。传统的现场…

Windows提权之基本流程(二)

首先我们 安装环境 首先 在百度网盘上下载好是这样的 通过网盘分享的文件&#xff1a;08serverR2-1.zip 链接: 百度网盘 请输入提取码 提取码: 7hyh --来自百度网盘超级会员v3的分享 我们在虚拟机里边打开 点击打开虚拟机 然后选中.vmx结尾的 双击打开 然后点击获取所有权 …

【LeetCode刷题记录】22. 括号生成(JS解法)

22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a…

ZT16 小欧的括号嵌套

描述 小欧想要构造一个合法的括号序列满足以下条件&#xff1a; 1.括号序列长度恰好为2n。 2.括号序列的嵌套层数最大值为r。 括号嵌套层数是指在一个字符串中&#xff0c;以左括号 "(" 和右括号 ")" 形成的括号对的最大嵌套深度。 例如&#xff0c;在字…

神经网络发展简史:从感知机到通用智能的进化之路

引言 神经网络作为人工智能的核心技术&#xff0c;其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角&#xff0c;梳理神经网络发展的五大关键阶段&#xff0c;结合具象化比喻和经典案例&#xff0c;为读者呈现一幅清晰的AI算法发展图谱。 一…