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

🔥草莓熊Lotso:个人主页
❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受。
🎬博主简介:

目录
前言
如果你是正在学习 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. Plauger | Windows Visual C++ | 闭源不可修改,可读性低,符号命名怪异 |
| RW 版本 | Rouge Wage 公司 | C++ Builder | 闭源不可修改,可读性一般 |
| SGI 版本 | Silicon Graphics | GCC(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 - 8 | Unicode 的 “存储方案”,目前最主流编码 | 可变长存储(英文字符 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-8 | UTF-16 | UTF-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 踩过的坑或编码解决技巧,一起进步!
✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど