深入探索C++ STL:从基础到进阶
目录
引言
一、什么是STL
二、STL的版本
三、STL的六大组件
容器(Container)
算法(Algorithm)
迭代器(Iterator)
仿函数(Functor)
空间配置器(Allocator)
配接器(Adapter)
四、STL的重要性
五、如何学习STL
六、STL的缺陷
总结
引言
在C++ 的世界里,标准模板库(STL)是一项极为强大的工具。它不仅为开发者提供了可复用的组件库,更是一个融合了数据结构与算法的软件框架。无论是在笔试的算法题中,还是在面试的技术问答环节,STL都频繁出现。今天,就让我们深入剖析STL,从它的基本概念、版本演进,到六大组件以及学习方法和存在的缺陷。
一、什么是STL
STL(standard template library - 标准模板库)是C++ 标准库的重要组成部分。它就像是一个工具箱,里面装满了各种数据结构(如vector、list、map等)和算法(如sort、find等)。以下是一个简单使用 vector 容器的示例代码:
cpp#include <iostream>#include <vector>int main() {// 创建一个vector容器,用于存储int类型的数据std::vector<int> myVector;// 向容器中添加元素myVector.push_back(1);myVector.push_back(2);myVector.push_back(3);// 遍历容器并输出元素for (int i = 0; i < myVector.size(); ++i) {std::cout << myVector[i] << " ";}std::cout << std::endl;return 0;}
难点剖析
这里涉及到模板的概念,模板使得STL能够适应不同的数据类型。理解模板的实例化过程,以及模板类型推导等机制,是掌握STL的基础。比如在 std::vector<int> 中,编译器会根据 <> 内指定的类型 int ,实例化出专门处理 int 类型数据的 vector 容器类。
二、STL的版本
原始版本
由Alexander Stepanov、Meng Lee在惠普实验室完成。本着开源精神,任何人都可以自由运用、拷贝、修改、传播、商业使用这些代码,唯一的条件是也要遵循开源原则。这个版本可以说是所有STL实现版本的鼻祖。
P.J.版本
由P.J. Plauger开发,继承自HP版本,被Windows Visual C++采用。但它有一些缺点,比如可读性比较低,符号命名比较怪异。这就导致开发者在阅读和理解其底层代码时会遇到一定困难。
RW版本
由Rouge Wage公司开发,同样继承自HP版本,被C++ Builder采用。它也存在不能公开或修改的问题,并且可读性一般。
SGI版本
由Silicon Graphics Computer Systems, Inc公司开发,继承自HP版本,被GCC(Linux)采用。它的可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。我们在后续学习STL阅读部分源代码时,主要参考的就是这个版本。
难点剖析
不同版本之间的差异,尤其是在底层实现细节和接口规范上的不同,对于深入研究STL的开发者来说是一个难点。在跨平台开发或者阅读不同编译器下的STL代码时,需要准确把握这些差异,避免出现兼容性问题。
三、STL的六大组件
容器(Container)
容器用于存储数据,常见的有 vector (动态数组)、 list (双向链表)、 map (键值对映射)等。例如,下面是一个使用 map 容器存储学生成绩的示例:
cpp#include <iostream>#include <map>#include <string>int main() {std::map<std::string, int> studentScores;studentScores["Alice"] = 90;studentScores["Bob"] = 85;// 遍历map并输出学生成绩for (const auto& pair : studentScores) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;}
算法(Algorithm)
算法作用于容器之上,实现各种数据处理功能,如排序、查找等。 std::sort 就是一个常用的排序算法,示例如下:
cpp#include <iostream>#include <vector>#include <algorithm>int main() {std::vector<int> numbers = { 5, 3, 8, 1, 2 };// 使用std::sort对vector进行排序std::sort(numbers.begin(), numbers.end());// 输出排序后的vectorfor (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;}
迭代器(Iterator)
迭代器提供了一种统一的方式来访问容器中的元素,就像一个智能指针。例如,使用迭代器遍历 vector :
cpp#include <iostream>#include <vector>int main() {std::vector<int> myVec = { 10, 20, 30 };// 使用迭代器遍历vectorfor (std::vector<int>::iterator it = myVec.begin(); it != myVec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;}
仿函数(Functor)
仿函数是行为类似函数的类,它可以作为算法的参数,实现自定义的操作。比如自定义一个比较函数对象用于 std::sort 的降序排序:
cpp#include <iostream>#include <vector>#include <algorithm>// 定义一个仿函数用于降序比较struct Greater {bool operator()(int a, int b) const {return a > b;}};int main() {std::vector<int> numbers = { 3, 1, 2 };// 使用自定义仿函数进行降序排序std::sort(numbers.begin(), numbers.end(), Greater());for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;}
空间配置器(Allocator)
空间配置器负责容器的内存分配与释放。一般情况下,我们使用默认的空间配置器,但在一些对内存管理有特殊需求的场景下,可能需要自定义空间配置器。
配接器(Adapter)
配接器用于修改容器、迭代器或仿函数的接口形式,以适应不同的需求。比如 stack 和 queue 就是基于其他容器(如 deque )实现的配接器容器。
难点剖析
理解六大组件之间的协作关系是一个难点。例如,算法需要通过迭代器来访问容器中的元素,仿函数可以作为算法的参数来定制算法行为。同时,不同容器的底层实现原理(如 vector 的动态内存管理、 map 的红黑树结构等)也需要深入掌握,才能在实际应用中合理选择和使用容器。
四、STL的重要性
在笔试中
经常会出现与STL相关的算法题,比如二叉数层序打印、重建二叉树、用两个栈实现一个队列等。这些题目往往会用到STL中的容器(如 queue 用于层序遍历)和算法(如自定义比较函数实现特定排序需求)。
在面试中
面试官常常会询问求职者对STL的理解,包括各种容器的特点、适用场景,以及算法的时间复杂度和空间复杂度等。掌握STL不仅能在面试中展示自己的技术能力,更能在实际项目开发中提高代码效率和质量。
五、如何学习STL
第一境界:熟用STL
这一阶段要求开发者能够熟练使用STL中的各种容器和算法。通过大量的练习题和实际项目实践,掌握每个组件的基本接口和使用方法。例如,在日常的算法练习中,尽量使用STL提供的工具来简化代码实现。
第二境界:了解泛型技术的内涵与STL的学理乃至实作
深入研究STL背后的泛型编程技术,理解模板元编程等高级特性。阅读STL的源代码,了解其底层实现原理,比如 vector 如何实现动态扩容, map 如何通过红黑树保证元素的有序性等。
第三境界:扩充STL
在对STL有了深入理解之后,可以尝试对其进行扩展和定制。比如自定义符合特定需求的容器或算法,或者优化现有的STL实现以满足项目的特殊性能要求。
难点剖析
从熟用STL到深入理解其底层原理并进行扩充,每一步都有不小的挑战。阅读STL的源代码需要具备深厚的C++ 功底,理解模板元编程等高级特性更是需要花费大量时间和精力。而对STL进行扩充和定制,则需要对整个STL框架有全面且深入的认识,同时还要有创新思维和解决复杂问题的能力。
六、STL的缺陷
更新缓慢
STL库的更新速度相对较慢。从C++98到C++11,中间相隔了13年,STL才进一步更新。这在快速发展的软件行业中,可能导致其无法及时跟上新的编程需求和技术趋势。
不支持线程安全
STL目前没有原生支持线程安全。在并发环境下使用STL容器时,需要开发者自己进行加锁等同步操作,而且锁的粒度往往比较大,可能会影响程序的性能。
追求效率导致内部复杂
STL为了追求极致的效率,内部实现比较复杂,例如类型萃取、迭代器萃取等机制。这使得代码的可读性和可维护性降低,对于初学者来说理解起来难度较大。
代码膨胀问题
由于模板的使用,STL可能会导致代码膨胀。比如多次实例化 vector<vector<vector<int>>> 这样的多层嵌套模板,会生成多份代码,增加了可执行文件的大小。
难点剖析
在实际项目中处理STL的这些缺陷,需要开发者具备丰富的经验和深入的技术理解。例如,在并发场景下解决线程安全问题,需要综合考虑锁的粒度、性能开销以及业务逻辑的复杂性等多方面因素。
总结
C++ STL是一个功能强大但又具有一定学习难度的工具集。通过深入理解它的各个方面,包括基本概念、版本差异、六大组件、重要性、学习方法和存在的缺陷,开发者能够在C++ 编程中更加游刃有余,编写出高效、可靠的代码。在不断的学习和实践中,我们也能逐渐掌握其精髓,为更复杂的软件开发项目打下坚实的基础。
希望这篇博客能对大家学习STL有所帮助,欢迎在评论区交流探讨!
相关文章:
深入探索C++ STL:从基础到进阶
目录 引言 一、什么是STL 二、STL的版本 三、STL的六大组件 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Functor) 空间配置器(Allocator…...
GitHub Desktop 推送报错 Authentication Failed 身份验证失败
弹窗问题: Authentication Failed 验证失败 We were unable to authenticate with https://gitee.com/.Pleaseenter your username and password to try again. 用户名 密码 Depending on your repository’s hosting service, you might need touse a Personal Acc…...
Webpack中的文件指纹:给资源戴上个“名牌”
Webpack中的文件指纹:给资源戴上个“名牌” 你是否想过,当你修改代码后,浏览器为什么仍然拿着旧版资源不放?秘密就在于——文件指纹!简单来说,文件指纹就像给每个构建出来的文件贴上独一无二的“姓名牌”&…...
ESP32开发之ubuntu环境搭建
1. 在Ubuntu官网下载Ubuntu server 20.04版本https://releases.ubuntu.com/20.04.6/ 2. 在vmware下安装Ubuntu 3. 改Ubuntu静态IP $ sudo vi /etc/netplan/00-installer-config.yaml# This is the network config written by ‘subiquity’ network: renderer: networkd eth…...
重构艺术 | 如何优雅地“提炼函数“
在工作中总数遇到非常多的长代码,俗称“屎山”,这类代码读起来特别费劲。自己想重构一遍,但是总感觉缺乏经验指导,因此,多读书,读好书可能是最优解之一。读《重构改善即有代码的设计》有感,便写…...
[项目]基于RT-Thread的CAN通信仪表盘显示屏: 一.项目概述与软硬件说明
基于RT-Thread的CAN通信仪表盘显示屏: 一.项目概述与软硬件说明 一.项目概述二.硬件与软件资源 一.项目概述 功能结构图: 通过上位机发出模拟CAN数据给协议转换板,协议转换板将CAN协议数据转换为迪文屏数据,并通过迪文数据控制相关性质。 …...
如何查看自己 Android App 的私有数据?从 `adb backup` 到数据提取全过程
🛠️ 如何查看自己 Android App 的私有数据?从 adb backup 到数据提取全过程 📌 前言:作为一名 Android 开发者,我常常想知道自己写的 App 在用户设备上的数据存储结构是怎样的,比如有没有数据写入成功、有…...
Windows中xxx.dll动态链接库文件转xxx.a静态库文件
最近在学习探索C/C程序代码中调用Python代码时,出现了一个问题:下载的程序库文件,在使用MinGW编译C/C的代码时,一直提示无法链接,才发现是库类型不对应,无法导入链接。 上图所示的Python对应库,…...
用Java NIO模拟HTTPS
HTTPS流程 名词解释: R1:随机数1 R2:随机数2 R3:随机数3 publicKey:公钥 privateKey:私钥 step1 客户端 client hello R1 服务端 server hello R2 publicKey(验证证书,证书包含公钥) step2 客户端 R3 publicKey加密 服务端 privateKey解密 s…...
基于YOLOv8的火车轨道检测识别系统:技术实现与应用前景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言:火车轨道检测领域概述 铁路运输作为国民经济的大动脉,其安全运行至关重要…...
解决 Ubuntu 上 Docker 安装与网络问题:从禁用 IPv6 到配置代理
解决 Ubuntu 上 Docker 安装与网络问题的实践笔记 在 Ubuntu(Noble 版本)上安装 Docker 时,我遇到了两个常见的网络问题:apt-get update 失败和无法拉取 Docker 镜像。通过逐步排查和配置,最终成功运行 docker run he…...
DVDFab Virtual Drive电脑DVD备份和制作软件 v13.0.3.7 中文绿色便携
前言 DVDFab Virtual Drive是一个很厉害的光盘处理软件,它能帮你做几件事情:复制你的DVD或蓝光光盘作为备份,把这些光盘里的内容转换成其他格式,还能把视频文件刻录到DVD或蓝光光盘上。这个软件很灵活,能处理像DVD、蓝…...
FISCO BCOS区块链Postman接口测试:高级应用与实战技巧 [特殊字符]
引言:为什么Postman是FISCO BCOS测试的利器? 在区块链开发领域,接口测试是确保系统稳定性和安全性的关键环节。作为国产领先的联盟链平台,FISCO BCOS在金融、政务、供应链等多个领域得到广泛应用。而Postman作为一款功能强大的API测试工具,凭借其直观的图形界面和丰富的测…...
a sort.py demo
这份代码展示了如何使用 sort.py。注意,此处,我将文件名改为 my_sort.py。 你并不能直接 copy 使用,因为环境,包,还有模型。 此处使用 SSD-MobileNetv2 进行物体检测,将结果传入以 np 数组的形式传入sort…...
Linux 入门八:Linux 多进程
一、概述 1.1 什么是进程? 在 Linux 系统中,进程是程序的一次动态执行过程。程序是静态的可执行文件,而进程是程序运行时的实例,系统会为其分配内存、CPU 时间片等资源。例如,输入 ls 命令时,系统创建进程…...
学习如何设计大规模系统,为系统设计面试做准备!
前言 在当今快速发展的技术时代,系统设计能力已成为衡量一名软件工程师专业素养的重要标尺。随着云计算、大数据、人工智能等领域的兴起,构建高性能、可扩展且稳定的系统已成为企业成功的关键。然而,对于许多工程师而言,如何有效…...
前端防御性编程
关于防御性编程 你是否遇到过,接口请求失败或者返回数据错误,导致系统白屏或者前端自身写的代码存在一些缺陷,导致整个系统不够健壮,从而导致系统白屏 常见的问题与防范 最常见的问题 访问了null或者undefined的属性 null.a …...
Java工具类-assert断言
我们可能经常在项目的单元测试或者一些源码中看到别人在使用assert关键字,当然也不只是Java语言,很多编程语言也都能看到,我们大概知道断言可以用于测试中条件的校验,但却不经常使用,本文总结了Java中该工具类的使用。…...
215. 数组中的第K个最大元素
1、题目分析 顾名思义。 2.算法原理 利用排序,再找到第k个最大的数字即可。 3.代码实操 class Solution { public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begin(),nums.end());return nums[nums.size()-k];//123456真的方便啊} };…...
【2025年泰迪杯数据挖掘挑战赛】B题 详细解题思路+数据预处理+代码分享
目录 2025年泰迪杯B题详细解题思路问题一问题分析数学模型Python代码Matlab代码 问题二问题分析数学模型Python代码Matlab代码 问题三问题分析数学模型Python代码Matlab代码 问题四问题分析数学模型Python代码Matlab代码 2025年泰迪杯B题详细解题思路 初步分析整理了B题的赛题分…...
对shell脚本敏感命令进行加密执行
我要加密这条命令:rm /root/scripty.sh 如何利用openssl aes-256-cbc 实现加密和解密,并执行命令 加密、解密并执行命令的完整流程 以下是使用 openssl aes-256-cbc 加密命令 rm /root/scripty.sh,解密并执行的详细步骤: 1. 加密…...
SQL ⑦-索引
索引 索引是一种特殊的数据结构,它帮助数据库系统高效地找到数据。 索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过对索引的搜索来加快速度。 索引好比书籍的目录,能帮助你快速找到相应的章节。 B树 B树是一种经常用于数…...
LinkedBlockingQueue使用场景有哪些
1、LinkedBlockingQueue 的特点 LinkedBlockingQueue 是 Java 中 java.util.concurrent 包下的一种阻塞队列,它有以下几个主要特点: 1.线程安全 LinkedBlockingQueue 是线程安全的,它内部使用了锁机制来确保多线程环境下的并发访问不会导致…...
关于难例损失函数小记
什么是难例损失函数(Hard Example Loss Function) 这玩意儿是深度学习训练中非常重要又很实用的一个概念,特别适用于处理 数据不平衡、模型收敛缓慢、或者**想让模型更“挑剔”**的场景。 🌟 先从名字讲起: “难例”…...
小程序开发指南
小程序开发指南 目录 1. 小程序开发概述 1.1 什么是小程序1.2 小程序的优势1.3 小程序的发展历程 2. 开发准备工作 2.1 选择开发平台2.2 开发环境搭建2.3 开发模式选择 3. 小程序开发流程 3.1 项目规划3.2 界面设计3.3 代码开发3.4 基本开发示例3.5 数据存储3.6 网络请求3.7 …...
RCE漏洞学习
1,What is RCE? 在CTF(Capture The Flag)竞赛中,RCE漏洞指的是远程代码执行漏洞(Remote Code Execution)。这类漏洞允许攻击者通过某种方式在目标系统上执行任意代码,从而完全控制目…...
青少年编程考试 CCF GESP图形化编程 三级认证真题 2025年3月
图形化编程 三级 2025 年 03 月 一、单选题(共 15 题,每题 2 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁 片《哪吒 2》票房惊人,入了全球票房榜…...
一、绪论(Introduction of Artificial Intelligence)
写在前面: 老师比较看重的点:对问题的概念本质的理解,不会考试一堆运算的东西,只需要将概念理解清楚就可以,最后一个题会出一个综合题,看潜力,前面的部分考的不是很深,不是很难&…...
多模态大语言模型arxiv论文略读(十五)
## Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ➡️ 论文标题:Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ➡️ 论文作者:Yuanwei Wu, Xiang Li, Yixin Liu, Pan Zhou, Lichao Sun ➡️ 研究机…...
漏洞报告:多短视频平台时间差举报滥用漏洞
漏洞标题:跨平台内容发布时序漏洞导致的恶意举报攻击向量 漏洞类型:逻辑缺陷/滥用机制 漏洞等级:中高风险 漏洞描述: 攻击者可利用多平台内容发布时间差,伪造原创证明对合法内容发起恶意举报。该漏洞源于平台间缺乏发…...
【LINUX】学习宝典
一.Linux系统常用单词翻译 1.new folder 新建文件夹 2.paste 粘贴 3.select all 全选 4.open in terminal 打开终端/命令行 5.keep aligned 保持对齐 6.organize deaktop by name按名称组织桌面 7.change background更改背景 8.cancel 取消 9.create创造 创建 10.wal…...
青少年编程考试 CCF GESP图形化编程 四级认证真题 2025年3月
图形化编程 四级 2025 年 03 月 一、单选题(共 10 题,每题 2 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁片《哪吒 2》票房惊人,入了全球票房榜…...
学习海康VisionMaster之平行线查找
一:进一步学习了 今天学习下VisionMaster中的平行线查找,这个还是拟合直线的衍生应用,可以同时测量两条线段,输出中线 二:开始学习 1:什么是平行线查找? 按照传统的算法,必须是开两…...
小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案
问答题: 0. 请问下面代码有没有毛病,为什么? 请问下面代码为什么会出错,应该如何解决? 答:这是由于在字符串中,反斜杠()会与其随后的字符共同构成转义字符。 为了避免这种不测情况的发生,我们可以在字符串的引号前面…...
2025 蓝桥杯省赛c++B组个人题解
声明 本题解为退役蒻苟所写,不保证正确性,仅供参考。 花了大概2个半小时写完,感觉比去年省赛简单,难度大概等价于 codeforces dv4.5 吧 菜鸡不熟悉树上背包,调了一个多小时 题目旁边的是 cf 预测分 所有代码均以通…...
2025蓝桥杯算法竞赛深度突破:创新题型与高阶策略全解析
一、新型算法范式实战 1.1 元启发式算法应用(预测难度:★★★★) 题目场景:星际货物装载 需在飞船载重限制下选择最优货物组合,引入遗传算法解决NP-Hard问题: 染色体编码:二进制串表示货物选择…...
网络流量管理-流(Flow)
1. 传统网络的问题:快递员送信模式 想象你每天要寄100封信给同一个朋友,传统网络的处理方式就像一个固执的快递员: 每封信都单独处理:检查地址、规划路线、盖章、装车…即使所有信的目的地、收件人都相同,也要重复100…...
Spring Boot对接马来西亚股票数据源API
随着对东南亚市场的兴趣日益增长,获取马来西亚股票市场的实时和历史数据变得尤为重要。本文将指导您如何使用Spring Boot框架对接一个假定的马来西亚股票数据源API(例如,StockTV API),以便开发者能够轻松访问和处理这些…...
MySQL 面经
1、什么是 MySQL? MySQL 是一个开源的关系型数据库,现在隶属于 Oracle 公司。是我们国内使用频率最高的一种数据库,我本地安装的是比较新的 8.0 版本。 1.1 怎么删除/创建一张表? 可以使用 DROP TABLE 来删除表,使用…...
【Flink运行时架构】作业提交流程
本文介绍在单作业模式下Flink提交作业的具体流程,如下图所示。 客户端将作业提交给YARN的RM;YARN的RM启动Flink JobManager,并将作业提交给JobMaster;JobMaster向Flink内置的RM请求slots;Flink内置的RM向YARN RM请求…...
【AutoTest】自动化测试工具大全(Java)
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 &#x…...
当DRAM邂逅SSD:新型“DRAM+”存储技术来了!
在当今快速发展的科技领域,数据存储的需求日益增长,对存储设备的性能和可靠性提出了更高的要求。传统DRAM以其高速度著称,但其易失性限制了应用范围;而固态硬盘SSD虽然提供非易失性存储,但在速度上远不及DRAM。 为了解…...
【算法】快速排序
算法系列六:快速排序 一、快速排序的递归探寻 1.思路 2.书写 3.搭建 3.1设计过掉不符情况(在最底层时) 3.2查验能实现基础结果(在最底层往上点时) 3.3跳转结果继续往上回搭 4.实质 二、快速排序里的基准排序 …...
Python快速入门指南:从零开始掌握Python编程
文章目录 前言一、Python环境搭建🥏1.1 安装Python1.2 验证安装1.3 选择开发工具 二、Python基础语法📖2.1 第一个Python程序2.2 变量与数据类型2.3 基本运算 三、Python流程控制🌈3.1 条件语句3.2 循环结构 四、Python数据结构🎋…...
机器学习中的数学(PartⅡ)——线性代数:2.1线性方程组
概述: 现实中很多问题都可被建模为线性方程组问题,而线性代数为我们提供了解决这类问题的工具。先看两个例子: 例子1: 一家公司有n个产品,分别是,生产上述产品需要m种原料,每个产品需要其中一…...
大模型上下文协议MCP详解(2)—核心功能
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 标准化上下文交互技术 1.1 实时数据接入能力 MCP(Model Context Protocol)通过标准化的接口,为 AI 模型提供了强大的实时数据接入能力,使其能够快速获取和处理来自不同数据源的实时信息。…...
检测到目标URL存在http host头攻击漏洞
漏洞描述 修复措施 方法一: nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。 server {listen 80 default_server; …...
【 Beautiful Soup (bs4) 详解】
引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析库,能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup:主类,用于构建文档树结构Tag:表示 HTML/XML 标签的对象…...
Cuto壁纸 2.6.9 | 解锁所有高清精选壁纸,无广告干扰
Cuto壁纸 App 提供丰富多样的壁纸选择,涵盖动物、风景、创意及游戏动漫等类型。支持分类查找与下载,用户可轻松将心仪壁纸设为手机背景,并享受软件内置的编辑功能调整尺寸。每天更新,确保用户总能找到新鲜、满意的壁纸。 大小&am…...
人工智能之数学基础:复矩阵
本文重点 复矩阵是线性代数中以复数为元素的矩阵,是实矩阵在复数域上的自然推广。与实矩阵相比,复矩阵在数学性质、运算规则和应用场景上具有独特性,尤其在量子力学、信号处理、控制理论等领域发挥关键作用。 复矩阵的定义与表示 定义:复矩阵指的是元素含有复数的矩阵。…...