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

无人机“黑飞”正式入法:2026年1月1日起违规飞行将面临拘留

无人机"黑飞"正式入法:2026年1月1日起违规飞行将面临拘留 一、新规核心内容 2025年6月27日,十四届全国人大常委会第十六次会议表决通过新修订的《中华人民共和国治安管理处罚法》,明确将无人机"黑飞"列为"妨害公共安全的行为",自2026年1月1日起正式实施。 法律依据:新《治安管理处罚法》第46条规定:"违反有关法律法规关于飞行空域管理规定,飞行民用无人驾驶航空器、航空运动器材,或者升放无人驾驶自由气球、系留气球等升空物体,情节较重的,处五日以上十日以下拘留。" 特别严重情形(如非法穿越边境线):最高可处十日以上十五日以下拘留。 二、"黑飞"的法律定义 **无人机"黑飞"**是指违反《无人驾驶航空器飞行管理暂行条例》等法律法规的无人机飞行活动,具体包括: 1.

By Ne0inhk
LazyLLM 测评 | 低代码颠覆 AI 开发!代码专家智能体进阶模块实战

LazyLLM 测评 | 低代码颠覆 AI 开发!代码专家智能体进阶模块实战

摘要: LazyLLM 是商汤大装置推出的开源低代码框架,作为构建和优化多 Agent 应用的一站式开发框架,覆盖应用搭建、数据准备、模型部署、微调、评测等全流程开发环节,提供丰富的工具支持。其以模块化设计打破传统开发壁垒,通过数据流驱动重构开发逻辑,能让开发者用极简代码实现工业级复杂 AI 应用,摆脱冗余编码束缚,聚焦核心业务场景,降低 AI 应用构建成本并支持持续迭代优化。堪称 AI 开发者的 “效率神器”,其技术普惠理念为 AI 开发领域带来新的实践范式,推动了更高效的开发模式。本文将以Python编程为切入点,带你深入了解LazyLLM框架。 LazyLLM 是构建和优化多 Agent 应用的一站式开发工具,为应用开发过程中的全部环节(包括应用搭建、数据准备、模型部署、模型微调、评测等)提供了大量的工具,协助开发者用极低的成本构建 AI 应用,并可以持续地迭代优化效果。 LazyLLM作为商汤大装置推出的开源低代码框架,简直是AI开发者的“效率神器”

By Ne0inhk
龙虾机器人(OpenClaw)本地部署完全技术指南

龙虾机器人(OpenClaw)本地部署完全技术指南

龙虾机器人(OpenClaw)本地部署完全技术指南 前言:什么是“龙虾机器人”? 在开始部署之前,我们需要明确部署的对象。通常所说的“龙虾机器人”指的是开源项目 OpenClaw(曾用名:Clawdbot、Moltbot)。它由程序员彼得·斯坦伯格开发,是一个开源的、可本地部署的通用型AI代理系统。与ChatGPT等对话式AI不同,OpenClaw被赋予了操作系统的权限:它可以执行终端命令、读写文件、操控浏览器、安装软件,甚至通过MCP协议调用外部工具。 由于其强大的系统操控能力,安全性是部署时需关注的首要问题。官方及社区普遍建议:不要在主力机或存有敏感数据的生产环境直接裸奔部署,最好使用虚拟机、Docker容器或专用硬件(如Mac Mini或AI开发盒子)进行隔离。 第一章:环境准备与核心依赖 在安装OpenClaw之前,必须准备好运行环境。OpenClaw的核心由TypeScript编写,因此Node.js是必不可少的运行环境。此外,根据安装方式的不同,可能还需要Git、Docker或Python环境。 1.1 硬件建议与系统选择 * Linux

By Ne0inhk
Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战 前言 在进行 Flutter for OpenHarmony 开发时,如何快速处理常见的字符串格式化、色值转换、日期计算或布尔值增强?虽然每一个功能都很小,但如果每个项目都重复造轮子,开发效率将大打折扣。arcane_helper_utils 是一款专注于极致实用的“瑞士军刀”型工具集。本文将探讨如何在鸿蒙端通过这类高内聚的 Utility 集实现极致、丝滑的业务交付。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过对 Dart 原生类型(Object, String, List, Map, Bool)

By Ne0inhk