STL中级

为什么我们在初级篇已经学习过一遍STL现在还要重新看书学呢?这是因为初级篇中我们仅仅介绍了一些最基本的STL相关概念的使用,而实际上我们并没有达到能够熟练使用STL的程序,所以这里我们选择了《C++标准程序库》和《Effective C++》两本书作为参考学习,为之后阅读《STL源码剖析》打下坚实的基础。

2022/7/31 9:56 说实话,《C++标准程序库》这本书不太适合我用来学习STL,感觉…普遍书籍存在的毛病吧,涉及的知识面太广了,关键这么广的知识面它几乎没有一个是介绍全面了的,导致看书的时候云里雾里的几乎是摸不着头脑,所以这里先暂时把这本书放一下,看看《Effective C++》能否给不一样的学习感受;

2022/7/31 10:22 咱们这个主题先暂时放下来吧(Effective STL也把我干懵了),我想着这STL熟练使用的话咱们可能现在还真的不太适合,先回过头去把C++再仔细看看,学习是一个慢慢来的事,不要过于着急;

——问题汇总——

(每当我们接触一个不熟悉的领域时,往往会和我们已经接触过的某些领域的知识点产生冲突以至于混淆某些概念,我们有必要静下心来罗列并且解决这些问题哦,这有助于我们学习新知识同时巩固旧知识,形成一个正确的知识结构)

Q1:C++标准库和STL的关系?答案参考(21条消息) C++标准库与STL的关系_Endless丶Go的博客-CSDN博客

A1:简单来说STL就是C++标准库(又称为C++标准链接库/C++标准程序库)的一个子集,C++标准库主要包含如下组件:C标准函数库<stdio.h>、语言支持部分、诊断部分(异常处理、断言、错误代码)、通用工具部分…

Q2:怎么使用C++标准库?答案参考C++ 标准库 | 菜鸟教程 (runoob.com)以及c++标准库(类库和函数的集合软件)_百度百科 (baidu.com)

A2:C++标准库可以分为标准函数库和面向对象类库,一般来说我们需要使用某个内置函数(如memcmp())只需要#include对应的头文件即可,

Q3:怎么判断我们使用的是C++标准库?答案参考(21条消息) 标准库 c++_C++的标准库_Junwei Liang的博客-CSDN博客

A3:其实简单来说,我们能够直接使用的函数、类都来自于C++标准库,我们没有显示链接是因为编译器帮助我们做了这一步;当我们想要使用的函数、类并没有在C++标准库中提供的时候就需要我们自己来编写;

Q4:Python有标准库吗?答案参考Python标准库是什么? - 优草派 (ycpai.cn)以及Python3 标准库概览 | 菜鸟教程 (runoob.com)

A4:其实这个问题能够帮助我们很好的理解C++标准库,因为Python本身确实有一个标准库,可以直接import模块即可使用,但是对于Python的第三方库,就必须先下载再import使用模块,我们类比C++标准库的话就可以联想C++是否也有需要下载才能使用的第三方库呢?当然是有的,只不过C++标准库提供的东西确实够用(至少对简单C++编程是这样),所以我们对于下载并使用C++第三方库印象并不深刻(具体使用方法可以参照C++新手,请问大神如何使用C++第三方库-CSDN社区

Q5:《C++标准程序库》只讲了STL吗?

A5:当然不是,我们从名称上就可以看出这本书介绍的是整个C++标准库,因为STL是C++标准库中最重要的子集,因此本书花费大量篇幅介绍STL;

第一部分

C++的整个标准化过程是为了建立一种通用的标准规格(标准化的目的不是为了发明新东西,而是为了让已有的东西协调共处),便于C++在不同平台之间的移植等;

“标准程序库是C++标准规格的一部分,提供一系列核心组件,用以支持I/O、字符串(strings)、容器(数据结构)、算法(排序、搜索、合并等等)、数值计算、国别(例如不同的字符集,character sets)等主题。”

“C++语言核心和C++程序库是同时被标准化的,这么一来,程序库可以从语言的发展中受益,语言的发展也可以从程序库的实践经验中得到启发。”

1.main()函数

只有两种main()是可移植的

1
2
main()
{...}
1
2
main(int argc,char *argv[])//这里的argv[]命令行参数数组也可以定义为char**
{...}

同时C++在main()的末尾定义了一个隐式的return 0;(当然传回零值表示成功退出main()函数,传回任何一种非零值都表示某种失败),因此我们可以不必手动return以结束main(),

2.命名空间

这个概念我们在C++中也介绍过,命名空间除了在概念上与类不同外,其跨文件使用(只需要using对应的命名空间即可)的特性也是普通类不具备的,这也就是我们常说的利用一个namespace来定义一些组件,这些组件可以分散在多个实质模块上(典型代表就是C++标准库,C++标准库的所有标识符都被定义在名为std(standard)的namespace中);

3.配置器

“C++标准程序库在许多地方采用特殊对象来处理内存配置和寻址,这样的对象称为配置器(allocator)。配置器体现出:一种特定的内存模型(memory model),成为一个抽象表征,表现出“内存需求”至“内存低阶调用”的转换。如果运用多个不同的配置器对象,你便可以在同一个程序中采用不同的内存模型。”

“配置器使得诸如共享内存(shared memory)、垃圾回收(garbage collection)、面向对象数据库(object oriented databases)等特定内存模型,能够保持一致的接口。”

C++标准程序库定义了一个缺省配置器allocator,缺省配置器会执行内存分配和回收的一般性手法(即呼叫new和delete操作符),最常用的依然是缺省配置器(配置器机制在STL中使用的较多,之后也会再介绍);

第二部分

1.STL组件

  • 容器:容器是用来管理某类对象的集合。每一种容器都有其优点和缺点,所以,为了应付程序中的不同需求,STL准备了不同的容器类型;
  • 迭代器:用于在一个对象群集(关于群集暂且理解为许多元素组成的集合)的元素上进行遍历,这个对象群集可以是一个容器也可以是容器的一部分。使用迭代器的时候无需知晓对应容器的内部结构可简单对容器元素进行遍历操作,每种容器都提供了知晓自身内部结构的特定的迭代器;
  • 算法:算法用来处理群集内的元素。它们可以出于不同的目的而搜寻、排序、修改、使用那些元素。透过迭代器的协助,我们只需撰写一次算法,就可以将它应用于任意容器之上,这是因为所有容器的迭代器都提供一致的接口;

STL的基本观念就是将数据和操作分离(这一点从某种意义上来说与OOP的设计思想是矛盾的),将数据交给容器存储管理,操作由可定制的算法定义;


STL中级
https://gintoki-jpg.github.io/2022/07/30/CPP_STL中级/
作者
杨再俨
发布于
2022年7月30日
许可协议