【C++初阶】C++编程基石:编码表&&STL的入门指南

🎈主页传送门****:良木生香

🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C++学习之路》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离



前言:在有了类和对象,内存管理,模板等知识的铺垫后,我们又向STL迈进了一步,上篇文章我们讲了C++的初阶模板,明白了C++泛型编程的基础就是模板,那么今天我们就来学习一下编码表和STL的组成


一、编码表

1.1、编码的由来:

在学习string之前,我们首先就要先搞清楚一个问题:我们为什么要学习string?主要是C语言中对于字符串处理不够恰当的地方:
C 语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列
的库函数,但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户
自己管理,稍不留神可能还会越界访问。
生活中,我们的电话号码,身份证,各种号码,使用振兴固然可以,但是在数字中加上一些符号之类的,整形就不能用了,这时候就要用字符串来处理

当我们在文档:Reference - C++ Reference中的cplusplus试图查找string类,发现找不到它,这是为什么?却在containers的目录下找到了,这是为什么?

这就是历史原因了。在C++98还未发布之时,C++委员会发现,C语言的char对于字符串不是很友好,有时候非常麻烦甚至坑人,所以委员会决定,设计出一种叫做字符串的东西,那时候还美哦与STL这个概念,但是已经出现了栈,队列这种数据结构的容器,所以string也被设计成了容器,这就是为什么String会被放到cintainers这个目录下的原因。

当我们点进string这个类中,会发现有这几个东西比较引人注目:

为什么会有这个么多种string类型呢?因为编码的原因。

1.2、编码的概念

编码:值与符号的映射关联集合

在互联网刚刚起步的时候,因为是美国人搞出来的技术,所以当时的编码只有数字、字母、符号的编码,美国人讲的是英文,所以他们认为这些符号的编码足够他们使用了,他们的编码标准也就是我i们常说的ASCII码。

但是到后来,互联网慢慢发展起来了,中国,日本,韩国等国家开始发展本国的互联网技术,这时候各个国家就自己搞了一套编码表,我们中国有GBK,日韩也有自己的编码表,此时就导致了一种情况:在不同编码表的情况下程序员互相发送程序,打开之后全是乱码,为了统一编码,防止乱码的出现,就发明出了万国表---Unicode,也就是平时我们见到的UTF-8这个编码.

但是这时候又有新的问题出现了:既然世界上所有符号(汉字,英文,emoji.....)都有一个为唯一的编号,那这些又该怎么存储到计算机中呢?于是就有了UTF-8、UTF-16、UTF-32这几种编码方式

UTF-8:

UTF-16:

UTF-32:

UTF-8同时也是一种变长编码,兼容ASCII,string主要就是存储UTF-8大小的字符。

1.3、GBK(国标)

带有"GB"字样的就是国标

冷知识:GBK将韩文和日文也收录进来了,毕竟他们的文化是从我们这里传出去的

国标采用的是双字节编码:字节A,字节B。(windows也支持GBK,毕竟中国市场占大头)

当我们对char类型的中文字符串进行运算,就会出现以下问题:

当我们对英文字符进行运算时,能够得到该字符的下一ASCII码值的字符,但是汉字不同,我们对my_string[0]++,是:字节A++,字节B不动,这就是典型的编码错误导致的结果出错。

二、STL简介

2.1、什么是STL?

STL(standard template libaray- 标准模板库 ) : C++ 标准库的重要组成部分 ,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架

在C++标准库中还有例如IO库,并发库等等,他们共同组成了C++的标准库

2.2、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 要阅读部分源代码,主要参考的就是这个版本。

2.3、STL的组成部分:

STL总共有六大组成部分:

**容器:**类似于数据结构:string,vector等等

**算法:**简单的实现函数,像Swap,find,max,min等等

**迭代器:**用于遍历容器

空间配置器:内存池

配接器:也叫适配器 ,有Stack、Queue等数据结构。

**仿函数:**其实就是开关,决定从左向右或者是从大到小之类的

2.4、STL的重要性

从三个维度来分析:笔试、面试、工作

2.4.1、笔试中

笔试:20道选择(权重40%)+2~3道算法编程题(权重60%)。

通过考察被面试者的能力来筛选出更加优质的人才,虽然说在项目中确实不怎么用得到非常高端的算法。像这种题目:

2.4.2、面试中

可能会问像下面这种问题:

  1. 讲一下你理解的数组吧,数组可以越界访问吗?(我说了编译的时候不会检查,运行可能崩溃)

  2. 讲一下指针吧(我说了指针的本质、指针的初始化、野指针的问题、然后高级指针、他问了函数指针用在什么地方,我说了回调函数、多态)

  3. 指针和引用的区别

  4. 讲一下栈内存和堆内存,栈里面放什么?(我说了栈里面临时变量、又问还有什么?还有函数的参数列表)

  5. 用github多么,你用svn么,git和svn有啥区别。(我说只用git没用过svn,区别不知道)

  6. 讲一下动态内存,还有内存泄漏,后来扯到了智能指针,我说了shared_ptr,引用计数,问了为什么要有引用计数,怎么实现?

  7. 平时自己使用过库里面的智能指针吗?

  8. 说一下链表吧,如何删除一个单链表的结点,链表的结点在内存中是固定的吗?

  9. 链表的迭代器失效,怎么解决?

  10. 平时使用STL中哪些容器比较多,我说list vector,后来就问map的底层实现是什么,map和哈希表的区别?(这个问题我觉得好奇怪)

2.4.3、工作中

网上有句话说: " 不懂 STL ,不要说你会 C++" 。 STL 是 C++ 中的优秀作品,有了它的陪伴,许多底层
的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。

2.5、STL该怎么学?

三层境界:能用->明理->模拟拓展

一位名人是这么说的:


那么以上就是本次所有的内容了

文章是自己写的哈,有什么描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读~~~~


博主手写笔记:


相关推荐
达帮主2 小时前
19.1 C语言链表 -- 简单
c语言·开发语言·链表
怎么没有名字注册了啊2 小时前
解决qt制作软件.app迁移问题(发布)Mac
开发语言·qt
秋92 小时前
学霸圈公认的 10 种高效学习习惯:从低效到顶尖的底层逻辑
人工智能·学习·算法
llm大模型算法工程师weng2 小时前
Java高并发架构设计:从理论到实战的全链路解决方案
java·开发语言
gihigo19982 小时前
MATLAB地震面波数值模拟方案
开发语言·matlab
CeshirenTester2 小时前
Claude Code 不只是会写代码:这 10 个 Skills,才是效率分水岭
android·开发语言·kotlin
并不喜欢吃鱼2 小时前
从零开始C++----四.vector的使用与底层实现
开发语言·c++
极简车辆控制2 小时前
泵控式电液主动悬架系统分层控制研究_论文复现
算法·汽车
沐雪轻挽萤2 小时前
17. C++17新特性-并行算法 (Parallel Algorithms)
java·开发语言·c++