一、学习动机

对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。

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

图 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

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

  1. stl源码剖析_STL源码剖析 阅读笔记(二)allocator

    一.空间分配器 allocator 从使用上看,空间分配在任何语言的任何组件都不需要我们去过多关心,因为语言.组件的底层肯定都比较完整的做了这件事情. 从实现上看,学习 allocator 的原理在源 ...

  2. sarscape 将dem文件转化成stl_STL文件,一种前处理网格划分技术??

    源:吴冠中作品 点击关注CAE仿真空间, 点亮"在看",优质内容不错过对于从事专业仿真技术的工程师而言,我们已经习惯而且能够熟练的利用诸如ANSA.Hypermesh等网格划分前处 ...

  3. Apollo源码剖析学习笔记2

    Apollo 源码剖析学习笔记2 Talker-ListenerNode 目录中包含了 Node 对象.Reader 对象和 Writer 对象.Node 对象主要对应 Ros 中的 Node 节点, ...

  4. 《STL源码剖析》笔记——allocator

    六大组件间关系 部分STL文件包含关系 allocator包含于中: 实际实现于三个文件 : 1.stl_construct.h :对象的构造和析构 2.stl_alloc.h空间配置和释放 3.st ...

  5. 4.2.10 Kafka源码剖析, 阅读环境搭建, broker启动流程, topic创建流程, Producer生产者流程, Consumer消费者流程,

    目录 4.1 Kafka源码剖析之源码阅读环境搭建 4.1.1 安装配置Gradle 4.1.2 Scala的安装和配置 4.1.3 Idea配置 4.1.4 源码操作 4.2 Kafka源码剖析之B ...

  6. 【STL源码剖析读书笔记】自己实现stack之MyStack(底层用MyList)

    MyList.h #ifndef MY_LIST_H #define MY_LIST_H#include<memory> //list的node结构 template<typenam ...

  7. sarscape 将dem文件转化成stl_SARscape与SARProz软件中的重要缩写

    1.SARscape SARscape 由 sarmap 公司研发,是国际知名的雷达图像处理软件.  该软件架构于专业的ENVI 遥感图像处理软件之上,提供完整的 SAR 数据处理功能,全面支持四种模 ...

  8. 【STL源码剖析读书笔记】【第5章】关联式容器之hashtable

    1.hashtable在插入.删除.搜寻操作上具有"常数平均时间"的表现,不依赖输入元素的随机性. 2.hashtable通过hashfunction将元素映射到不同的位置,但当不 ...

  9. STL源码剖析读书笔记--第6章第7章--算法与仿函数

    老实说,这两章内容还蛮多的,但是其实在应用中一点点了解比较好.所以我决定这两张在以后使用过程中零零散散地总结,这个时候就说些基本概念好了.实际上,这两个STL组件都及其重要,我不详述一方面是自己偷懒, ...

最新文章

  1. cdh的集成phoenix安装_环境篇:Kylin3.0.1集成CDH6.2.0
  2. 超强PHP集成环境,支持800多个不同PHP版本同时运行,无限自定义添加mysql与php版本...
  3. Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载
  4. 采用8种相位,每种相位各有两种幅度的QAM调制方法,在1200Baud的信号传输速率下能达到的网数据传输速率为( )
  5. .Net Core实现区块链初探
  6. 坚果云开发团队分享高效代码审查经验
  7. 自顶向下 计算机网络知识,计算机网络(自顶向下)第七版考试复习要点(第四章)...
  8. 处理minist数据集,把网络和数据都放在gpu上面。
  9. ubuntu18常用软件安装设置
  10. swift 脚本_Swift脚本和命令行参数
  11. linux pagecache与内存占用
  12. 接口接收数据_基于原语的千兆以太网RGMII接口设计
  13. c语言如何做一个打卡的程序,C语言实现学生打卡系统
  14. ssm毕设项目自来水收费管理系统7yd5p(java+VUE+Mybatis+Maven+Mysql+sprnig)
  15. 计算机一级excel函数rank函数应用,2017年计算机一级excel操作题
  16. PDF文件密码怎么解除
  17. C#適應練習:幾種常見設計模式的實現
  18. 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...
  19. Java中print()\println()\printf()的区别及用法
  20. 人脸识别+深度学习,水平远超人类大脑!

热门文章

  1. rxjs里scan operators的用法
  2. Angular里的购物车页面实现
  3. 使用SAP OData offline库实现Android应用的离线(offline)模式
  4. SAP UI5 Repository and MongoDB Repository
  5. SAP扫盲系列之二:SAP ABAP应用服务器的组成部分
  6. 运行在Docker里的SpringBoot应用,如何查看记录在文件系统的日志
  7. how debug option is handled - handle_debug
  8. WebSocket服务器端的日志重复打印问题
  9. Change handler table ESH_EX_CPOINTER
  10. SAP S/4HANA是如何通过SADL框架加CDS view读取销售订单数据的