从零开始的 STL 实现记录:Iterator-2
前言
迭代器(iterators)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。《Designt Patterns》一书提供有 23 个设计模式(design patterns)的完整描述,其中iterator 模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。
不论是泛型思维或 STL 的实际运用,迭代器(iterators)都扮演着重要的角色。STL 的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在-起。容器和算法的泛型化,从技术角度来看并不困难,C++的class templates 和 function templates 可分别达成目标。如何设计出两者之间的良好胶着剂,才是大难题。
———— 《STL源码剖析》侯捷
本篇博客将会讲解 STL 中迭代器的相应型别。
迭代器相应型别
根据经验,最常用到的迭代器相应型别有五种:value type,difference type,pointor,reference ...
从零开始的 STL 实现记录:Iterator-1
前言
迭代器(iterators)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。《Designt Patterns》一书提供有 23 个设计模式(design patterns)的完整描述,其中iterator 模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。
不论是泛型思维或 STL 的实际运用,迭代器(iterators)都扮演着重要的角色。STL 的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在-起。容器和算法的泛型化,从技术角度来看并不困难,C++的class templates 和 function templates 可分别达成目标。如何设计出两者之间的良好胶着剂,才是大难题。
———— 《STL源码剖析》侯捷
本篇博客将会介绍迭代器与 traits 编程技法的由来,这部分强烈推荐看侯捷老师的书,叙述的十分清晰明了。
iterators
迭代器是将算法和容器两个独立的泛型进行调和的一个接口。使我们不需要 ...
从零开始的 STL 实现记录:Allocator-3
前言
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出。但若以 STL 的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL 的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。
———— 《STL源码剖析》侯捷
考虑到小型区块所可能造成的内存破碎问题,SGI 设计了双层级配置器,第一级配置器直接使用 malloc() 和 free(),第二级配置器则视情况采用不同的策略:当配置区块超过 128 bytes 时,视之为“足够大”,便调用第一级配置器:当配置区块小于 128 bytes 时,视之为“过小”,为了降低额外负担 overhead,便采用复杂的 memory pool 整理方式,而不再求助于第一级配置器。
SGI 第二级配置器的做法是,如果区块够大,超过 128 bytes 时,就移交第一级配置器处理。当区块小于 128 bytes 时,则以内存池( memory pool ...
从零开始的 STL 实现记录:Allocator-2
前言
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出。但若以 STL 的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL 的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。
———— 《STL源码剖析》侯捷
虽然 SGI 也定义有一个符合部分标准、名为 allocator 的配置器,但 SGI 自己从未用过它,也不建议我们使用。主要原因是效率不佳,只把 C++ 的 ::operator new 和 ::operator delete 做一层简单的包装而已。
allocator
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808 ...
从零开始的 STL 实现记录:Allocator-1
前言
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出。但若以 STL 的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL 的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。
———— 《STL源码剖析》侯捷
本篇博客将会记录在实现 Allocator 过程中需要了解的知识点。
Allocator 相关知识点
new 与 delete
为了精密分工,STL 将空间分配与构造对象两阶段操作分开来进行,内存配置操作由 alloc::allocate() 负责,内存释放操作由 alloc::deallocate() 负责,对象构造操作由 ::construct() 负责,对象析构操作由 ::destory() 负责。在实现这些功能之前需要了解一般情况下的 C++ 内存配置与释放操作。
New 干了什么事情
先分配 memory,再调用ctor(构造函数)
假设有一个 Comp ...
红黑树寄录
被狗红黑树气晕
Butterfly 改造记录
简单记录一下博客的主题改造与美化过程
Hexo-Butterfly Blog 搭建记录
简单记录一下博客的搭建过程
从零开始的transformer机翻
前言
久闻 transformer 大名却一直没有完整使用过,这次将利用 transformer 完整地完成一次机翻的任务。
加载项目所需的 package
123456789101112131415161718192021import os # 观察文件、路径等import json # 查看及储存 json 文件 import torch # pytorchfrom tokenizers import Tokenizer # 英文分词from tqdm import tqdm # 进度条,用于观察任务进度from torchtext.vocab import build_vocab_from_iterator # 构建词典的模块import jieba # jieba 中文分词from torch.nn.functional import pad # pad 函数,用于填充及截断数据from torch.utils.data import Dataset, DataLoaderfrom torch import nn import mathimport num ...
Pytorch 的自动混合精度 (AMP)
最近了解到了 Pytorch可以通过 AMP 模块来进行混合精度训练以减小显存需求,这里记录一下相关内容。
NLP中的subword
NLP中经常会听到subword这一概念,但总是一知半解,这里总结一下subword的内容。