sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍

一、学习动机

对C++的理解:最近因为工作原因需要重新对C++进行学习,而上一次系统、全局的学习C++已经是在本科时期了,然后是读研期间的第一年学过一点皮毛,后来对C++的学习都是边用边学。纵然这样已经足够我解决大多数开发和业务上的问题了,但是没有真正对其底层进行深入研究,还是无法说真正学会了这个语言或者对这个语言足够“熟悉”。

对语言底层的理解:在入行以来,其实学过很多语言,诸如VB、C、C++、Java、HTML、CSS、JS、Python等。可以说想快速上手一门语言进行开发工作对我而言不是什么问题了,然而关于各种不同语言的相同点和异同点,底层的一些基本模型,我其实也并未过多的深究。

对实现细节的理解:读研期间做深度学习和算法,为了快速实现功能,主要使用的是Python。众所周知,Python的语言难度低,易用性高。虽然开发人员使用方便,但也隔绝了许多细节。这些细节从学习和探究的角度来说,其实是很宝贵的。

对数据结构的理解:Python的数据结构封装的比较完整和成熟,使用的时候基本上就是随用随取,诸如list、map、set的使用,非常方便。所以在刷题(LeetCode)时,语言上首选的都是Python。刷题的时候确实很爽,很有助于提高刷题进度、快速实现、理解思路,但是感觉这种方式还是不够“硬核”。想要真正检测自己的算法Coding水平,可能还是要用C++来实现。

出于以上几个原因方面,决定对C++重新学习,深入思考。

C++从传统的98已经到后来的11、14、17,直到现在的20,但最常用的可能还是98和11。所以先对98和11理解,旨在打牢基础,理解原理,而不在于语法糖、新特性、快速实现等。

这里定两个小目标。

  • 把《STL源码剖析》一书阅读一遍,搞清基本的STL底层实现。
  • 使用C++把算法题刷200道。

二、前言

首先来了解一下《STL源码剖析》这本书,这里摘录原书引文的几句话。

  • 为什么要学STL库?
而今STL不仅为千千万万C++程序员日常运用,而且获得极高的学术赞誉,成为一个典范、一种境界。作为一个软件框架,STL所取得的成功,实在可以用“辉煌”来形容,其所内涵的软件思想和技术经验,更是无比的深厚与精致。
大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品味都会获得快速的成长。
天下大事,必作于细。
参观飞机工厂并不能让你学到流体力学,也不能让你学会开飞机。然而你如果会开飞机又懂流体力学,参观飞机工厂可以带给你最大的乐趣和价值。
  • 为什么要读侯捷老师的书?
本书的作者侯捷先生,最令人称道之处,乃是他剖析大架构的能力。就是要在洋洋洒洒数以万计的源码中,精准定位,抽取核心观念,高屋建瓴,纲举目张,将看上去乱码一般的源码梳理得头绪清晰,条理分明,同时又照顾细节,参透精微,把一个个关键动作阐述的通通透透。
  • 侯捷老师如何写这本书?
不了解allocator,无论剖析也好,扩展也罢,必然处处碰壁。侯先生毫不迟疑,首先帮读者搬开这块绊脚石,理出头绪,实在是匠心独具。紧接着第三章iterator及traits,直入STL核心观念与关键技术,剑走中锋,直取要害,高举高打,开诚布公,直接把理解STL的钥匙交到读者手上。此章一过,读者神完气足,就可以大刀阔斧的打通STL的重重关隘。此布局只要稍有变化,读者的学习难度势必猛增。侯先生的此种安排,实在大家手笔!
  • 这本书有些什么内容
1. STL概论与实现版本简介
2. 空间配置器 allocator
3. 迭代器 iterators 与 traits 编程技法
4. 序列式容器 sequence container
5. 关联式容器 associated containers
6. 算法 algorithms
7. 仿函数或函数对象 functors or function objects
8. 配接器 adapter

三、STL介绍

STL是标准模板程序库,它所实现的,是依据泛型思维架设起来的一个概念结构。这个以抽象概念(abstract concepts)为主体而非以实际类(classes)为主体的结构,形成了一个严谨的标准接口。在此接口之下,任何组件都有最大的独立性,并以迭代器(iterator)胶合起来,以配接器(adapter)互相配接,以仿函数(functor)动态选择某种策略(policy 或 strategy)。

(一)STL六大组件

  1. 容器(containers):各种数据结构,如vector、list、deque、set、map,用来存放数据。从实现来看,STL容器是一种 class template。就体积而言,这一部分很像冰山在海面下的比率。
  2. 算法(algorithms):各种常用算法如 sort、search、copy、erase,从实现的角度来看,STL算法是一种 function template。
  3. 迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种类型,以及其它衍生变化,从实现的角度来看,迭代器是一种将:operators*、Operator->、Operator++、Operator-- 等指针相关操作予以重载的class template。所有STL容器都附带有自己专属的迭代器——只有容器设计者才知道如何遍历自己的元素,原生指针(native pointer)也是一种迭代器。
  4. 仿函数(functors):行为类似函数,可作为算法的某种策略(policy),从实现的角度来看,仿函数是一种重载了 operator () 的 class 或 class template。一般函数指针可视为狭义的仿函数。
  5. 配接器(adapters):一种用来修饰容器(containers)或仿函数(functors)或迭代器(iterators)接口的东西,例如:STL提供的 queue 和 stack,虽然看似容器,其实只能算是一种容器配接器,因为 它们的底部完全借助 deque,所有操作由底层的 deque 供应。改变 functor 接口者,称为 function adapter;改变 container 接口者,称为 container adapter;改变 iterator 接口者,称为 iterator adapter。配接器的实现技术很难一言蔽之,必须逐一分析。
  6. 配置器(allocators):负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 class template。

六大组件的关系如下图所示。

b809735fc2df1326701a2d0c392bf4ed.png
图 STL六大组件的交互关系:container通过allocator取得数据存储空间,algorithm通过iterator存取container内容,functor协助algorithm完成不同策略变化,adapter可以修饰或套接functor。

(二)SGI STL 文件分布与简介

  • C++ 标准规范下的 C 头文件(无扩展名),如 cstdio、cstdlib、cstring
  • C++ 标准程序库中不属于 STL 范畴者,如 stream、string
  • STL 标准头文件(无扩展名),如 vector、deque、list、map、algorithm、functional
  • C++ Standard 定案前,HP 所规范的STL 头文件,如 vector.h、deque.h、list.h、map.h、algo.h、function.h
  • SGI STL 内部文件(STL 真正实现于此),如 stl_vector.h、stl_deque.h、stl_list.h、stl_map.h、stl_algo.h、stl_function.h
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值