C++ 开发者必看!STL 库 + 字符编码一篇通,告别乱码与重复造轮子

C++ 开发者必看!STL 库 + 字符编码一篇通,告别乱码与重复造轮子

🔥草莓熊Lotso:个人主页

❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》

生活是默默的坚持,毅力是永久的享受。


 🎬博主简介:


目录

前言

一.STL库:C++开发者的"效率神器"

1.1 什么是STL

1.2 主流STL版本对比:特点和差异

1.3 STL六大组件

1.4 为什么一定要学STL?(3个方面3个理由)

1.4.1 笔试面试刚需

1.4.2 工作效率和个人能力

1.5 STL学习的三大境界:从"熟用'到“扩充”

二.字符编码:从乱码到清晰

2.1 为什么需要字符编码

2.2 四种常用的编码:区别与联系

2.3 UTF-8、UTF-16、UTF-32的对比

2.4 开发中的使用建议:避免乱码

结尾


前言

如果你是正在学习 C++ 的开发者,大概率听过两个 “绕不开” 的话题:一是 STL 库 —— 江湖传言 “不懂 STL,不算会 C++”,它能帮你跳过重复造轮子的坑,直接调用成熟的数据结构与算法;二是字符编码 —— 写代码时突然遇到的 “乱码”,多半是 ASCII、Unicode、GBK、UTF-8 没搞明白。这篇博客就从基础出发,一边带你吃透 STL 库的核心(版本、六大组件、学习路径),一边理清字符集之间的演化关系,帮你打通 C++ 开发的 “基础关卡”,不管是笔试面试还是实际项目,都能少走弯路。

一.STL库:C++开发者的"效率神器"

1.1 什么是STL

  • STL:是C++标准库的重要组成部分,不只是一个可复用的代码组件库,而且还是一个包罗数据结构与算法的软件框架,能够帮我们快速实现一下啊复杂功能,避免像之前C语言一样重复实现一些底层逻辑。

1.2 主流STL版本对比:特点和差异

--不同的编译器适配的STL版本也不同,搞懂差异能让我们使用起来更得心应手。

原始版本:

  • Alexander Stepanov,Meng Lee在惠普实验室完成的原始版本,本着开源的精神,他们声明允许任何人任意运用,拷贝,修改,传播,商业使用这些代码,无需付费。唯一的条件就是也需要像原始版本一样做开源使用。HP版本--所有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 并阅读部分源代码时,主要参考的就是这个版本
版本开发者 / 机构适配编译器特点
HP 版本Alexander Stepanov、Meng Lee-所有 STL 版本的 “始祖”,开源免费,允许修改与商业使用
P.J. 版本P.J. PlaugerWindows Visual C++闭源不可修改,可读性低,符号命名怪异
RW 版本Rouge Wage 公司C++ Builder闭源不可修改,可读性一般
SGI 版本Silicon GraphicsGCC(Linux)推荐学习版本!可移植性强、开源可修改,命名与编程风格清晰,适合阅读源码

1.3 STL六大组件

--这里不做过多的介绍,在后续的学习中我们会慢慢了解到这些组件的。

1.4 为什么一定要学STL?(3个方面3个理由)

1.4.1 笔试面试刚需

  • 笔试常考用STL实现数据结构(如两个栈实现队列)以及其它算法题高频使用STL库,面试中STL的相关知识也是考的比较多的
笔试题:

把二叉树打印成多行_牛客题霸_牛客网

重建二叉树_牛客题霸_牛客网

用两个栈实现队列_牛客题霸_牛客网

面试题:



1.4.2 工作效率和个人能力

  • 网上有句话说:“不懂STL,不要说你会C++”.STL是C++中的精华,熟练运用STL是区分“新手”与“合格开发者”的重要标志,也是后续学习编程的基础,在工作中也能帮助我们快速提高效率。

1.5 STL学习的三大境界:从"熟用'到“扩充”

根据下面这段话我们可以知道学习STL大概可以分为三个境界:

简单总结一下学习STL的三个境界就是:能用,明理,能扩展。


二.字符编码:从乱码到清晰

2.1 为什么需要字符编码

  • 这个我们在前面C语言的学习中就讲到过,计算机只认识“0”和“1”,字符编码简单来讲就是将人们可读的字符转换为二进制的规则,这其中不同的编码存在一些差异,但是本质上来说都是差不多的。

2.2 四种常用的编码:区别与联系

  • ASCII:最基础的编码,仅包含英文字母、数字、标点符号,用 1 个字节(8 位)表示,能表示 128 个字符。缺点明显 —— 无法存储中文、日文等非英文字符,这也是早期软件出现乱码的原因之一。
  • GBK:为解决中文存储而生的 “国家标准编码”,兼容 ASCII(英文字符用 1 字节),中文用 2 字节表示,能覆盖简体中文、繁体中文等字符。但缺点是 “地域性强”,仅在中文场景适用,跨语言(如中英文混排)时易出问题。
  • Unicode:“统一字符集”,目标是覆盖全球所有语言的字符(包括中文、英文、日文、符号等),每个字符分配唯一的 “编码值”(如‘A’是 U+0041,‘中’是 U+4E2D)。但 Unicode 只是 “字符与编码值的映射表”,不规定 “如何存储”—— 如果直接用 4 字节存储所有字符,会浪费大量空间(英文字符只需 1 字节,却要占 4 字节)。
  • UTF-8:Unicode 的 “存储方案”,是目前最主流的编码(如网页、代码文件多采用 UTF-8)。它的核心是 “可变长存储”:英文字符用 1 字节(兼容 ASCII),中文用 3 字节,生僻字符用更多字节,兼顾 “全球字符覆盖” 与 “存储效率”,完美解决了 ASCII 的局限和 Unicode 的存储浪费问题。
编码类型核心特点存储字节覆盖字符范围局限性 / 优势
ASCII最基础编码,仅含英文字母、数字、标点符号1 字节(8 位)128 个字符缺点:无法存储中文、日文等非英文字符,早期软件乱码原因之一;优势:简单基础
GBK为解决中文存储的 “国家标准编码”,兼容 ASCII英文字符 1 字节,中文 2 字节简体中文、繁体中文等缺点:地域性强,仅在中文场景适用,跨语言易出问题;优势:解决中文存储问题
Unicode“统一字符集”,为全球所有语言字符分配唯一编码值若直接存储,所有字符用 4 字节全球所有语言字符(中文、英文、日文、符号等)缺点:直接存储会浪费大量空间(英文字符只需 1 字节却占 4 字节);优势:覆盖全球字符
UTF - 8Unicode 的 “存储方案”,目前最主流编码可变长存储(英文字符 1 字节,中文 3 字节,生僻字符更多字节)全球所有语言字符优势:兼顾 “全球字符覆盖” 与 “存储效率”,完美解决 ASCII 的局限和 Unicode 的存储浪费问题

代码演示:(大家可以自己下去运行调试看看)

int main() { char buff1[] = "abcA"; buff1[0]++; char buff2[] = "草莓熊Lotso"; cout << sizeof(buff2) << endl;// buff2[1]++; cout << buff2 << endl; buff2[1]++; cout << buff2 << endl; buff2[3]++; cout << buff2 << endl; buff2[3]++; cout << buff2 << endl; return 0; } 

2.3 UTF-8、UTF-16、UTF-32的对比

对比维度UTF-8UTF-16UTF-32
编码方式可变长(1-4 字节)可变长(2 字节为主,辅助字符 4 字节)固定长(始终 4 字节)
空间占用英文 1 字节(省空间),中文 3 字节基本字符 2 字节(适中)所有字符 4 字节(较浪费)
核心优势兼容 ASCII,网络 / 文件传输主流基本字符处理效率高字符定位 / 操作最简单高效
典型应用场景网页、Linux 系统、邮件、代码文件Windows 系统、Java/.NET 虚拟机高要求字符处理库、特定算法场景
补充资料:UTF-8:

UTF-16:

UTF-32:

2.4 开发中的使用建议:避免乱码

  • 代码文件中推荐统一使用UTF-8编码(IDE中可以设置)
  • 用STL的string容器处理文本时,注意编码的统一性(比如读取GBK文件时,需转换成UTF-8再存储,避免乱码)
  • 跨平台使用时,优先使用UTF-8,避免一些因为编码差异产生的兼容性问题。

结尾

往期回顾:

《从崩溃到精通:C++ 内存管理避坑指南,详解自定义类型 new/delete 调用构造 / 析构的关键逻辑》

别再用函数重载堆代码了!C++ 模板初阶教程:原理 + 实例 + 避坑,新手也能秒懂

结语:STL 是 C++ 的 “效率工具”,字符编码是开发的 “避坑基础”,两者学好能少走很多弯路。刚开始不用追求精通,先会用 STL 做开发、记牢 UTF-8 主流地位,后续再逐步深入。觉得有用欢迎点赞收藏,可以在评论区聊聊你用 STL 踩过的坑或编码解决技巧,一起进步!

✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど


Read more

Python pytest 框架通关指南:自动化测试不再难

Python pytest 框架通关指南:自动化测试不再难

文章目录 * 一、pytest介绍 * 1.1 pytest的优点 * 1.2 主流Python接口自动化框架对比 * 二、安装 * 三、用例运行规则 * 四、pytest命令参数 * 4.1 常见参数 * 4.2 命令使用示例 * 五、pytest配置文件 * 5.1 常见配置选项 * 5.2 配置示例 * 六、前后置操作 * 6.1 setup_method 和 teardown_method * 6.2.setup_class 和 teardown_class * 七、断言 * 7.1 基本数据类型断言:

By Ne0inhk

一篇最全Python 爬虫超详细讲解(零基础入门,适合小白)

一篇最全Python 爬虫超详细讲解(零基础入门,适合小白) 大家好!我是 Grok,由 xAI 构建。今天我们来聊聊 Python 爬虫。作为一个零基础教程,我会从最简单的地方开始,一步步带你入门。爬虫(Web Scraping)就是用程序自动从网站上抓取数据的工具,比如下载图片、收集新闻、分析价格等。为什么学?因为它超级实用,能帮你自动化很多重复工作,比如监控电商价格或收集研究数据。 注意:爬虫要遵守法律和道德!不要爬取受保护的数据(如个人信息),尊重 robots.txt 协议,避免高频请求导致网站崩溃。否则可能被封 IP 或面临法律风险。 这个教程基于 2026 年最新实践(Python 3.12+),结合了网络上热门资源(如 Bilibili 尚硅谷教程、知乎文章等)

By Ne0inhk

Python 2026 年发展局势:AI 时代的 “通用基础设施语言”

2026 年的 Python 已从 “热门编程语言” 进化为全球数字生态的核心基础设施语言,其地位不仅稳固且进一步强化,同时也面临新的机遇与挑战,整体呈现 “一核多翼、优势固化、局部竞争” 的格局。 一、核心优势:AI + 全生态双轮驱动,地位无可替代 1. AI / 大模型领域的绝对霸主这是 Python 最核心的护城河。2026 年大模型落地、AI Agent 开发、多模态应用、低代码 AI 工具等场景中,Python 依然是95% 以上开发者的首选语言: * 生态垄断:PyTorch 3.0、TensorFlow 2.18、LangChain 2.0、Transformers 等核心框架均以 Python 为第一开发语言; * 效率优势:

By Ne0inhk
在Windows11系统上配置interl Realsense D435i深度相机+Python

在Windows11系统上配置interl Realsense D435i深度相机+Python

一、产品介绍 Intel RealSense D435i是英特尔公司推出的一款消费级深度相机,它的主要构成如下图所示。 主要包含一个RGB相机、两个红外相机以及一个红外发射器,此外还有一个IMU单元(这也就是D435i和D435的区别,i就表示imu)。简单来说它的深度成像原理是主动立体红外成像,不是传统意义上理解的双目RGB相机成像,这点需要注意一下。 有了深度图(3D点云)和对应的RGB影像,因此也就很容易获得RGB-D点云了。因此从输出的角度而言,D435i可以看做是一个RGB-D传感器相机。后续可以搭配ORB-SLAM中RGB-D的模式进行使用。当然,也可以只用单目RGB影像,以单目SLAM模式运行,或者单目结合IMU,以Mono-Initial模式运行。唯一不能运行的是双目RGB模式(因为两个红外相机是单通道的)。当然我们可以获取双目的红外影像,以此作为输入,进行双目SLAM,结果也是类似的。因此可以看出,D435i是一个比较“全能”的传感器,从单目、单目+IMU、双目、双目+IMU、RGB-D都可以使用。 对于它的一些技术上的参数,这里也简单列举一下: * 深度技

By Ne0inhk