【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该怎么学?

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

一位名人是这么说的:


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

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


博主手写笔记:


相关推荐
水云桐程序员17 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
测试员周周17 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
平凡但不平庸的码农18 小时前
Go Slice 详解
算法·golang
RSTJ_162518 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
赏金术士19 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
炸膛坦客20 小时前
嵌入式 - 数据结构与算法:(1-7)数据结构 - 顺序表和链表的对比
数据结构·链表
加号321 小时前
【Qt】 应用程序发布:依赖库拷贝与部署指南
开发语言·qt
Jasmine_llq21 小时前
《B3867 [GESP202309 三级] 小杨的储蓄》
算法·循环遍历·数组累加(模拟)·索引定位·顺序输出
啦啦啦_999921 小时前
案例之 逻辑回归_电信用户流失预测
算法·机器学习·逻辑回归
('-')21 小时前
八股复习2:Java Array list和Linked list
java·开发语言