存档

2014年6月 的存档

STL笔记之list

2014年6月30日 没有评论

STL提供的list是一个双向链表容器,对应的迭代器类型为Bidirectional Iterators. 对于双向链表我们可以方便的在任意位置进行插入和删除操作,list每个节点的内存位置之间没有必然联系。
1. list 迭代器
链表由许多节点链接在一起构成,list中的节点的定义如下:

// ListNodeBase定义
struct _List_node_base {
_List_node_base* _M_next;
_List_node_base* _M_prev[......]

继续阅读

STL笔记之vector

2014年6月20日 没有评论

vector是初次了解STL接触最多的一个容器,是一种很方便的数组替代品,不需要显示指定容量大小,其内部可以根据需要进行自动扩容操作。也正因为这个特性,每次扩容的时候都会伴随着“配置新空间 / 移动旧数据 / 释放旧空间”的操作,因此是有一定的时间成本的,当然vector提供了reserve接口,如果能够对元素个数有一个大概的了解,那么可以一开始就分配合适的空间。vector的内存空间是连续的,因此对插入元素的操作而言,在vector尾部插入才是合适的选择。
1. _Vector_base 基类[......]

继续阅读

STL笔记之迭代器

2014年6月14日 2 条评论

迭代器(iterator)是STL里面很基础也很重要的一个东西,迭代器的traits技术设计的很棒(在上一篇文章《STL笔记之空间配置器》中提到destroy函数使用了traits技术来判断对象是否具有trivial destructor,然后通过重载自动选择合适的实现版本)。
迭代器是一种行为类似指针的对象,因为指针最常用的是->和*两个操作符,因此迭代器最重要的编程工作也是对这两个操作符的重载的实现。
1. 初探traits技术
假设现在定义了这样一个迭代器MyIter,当我们拿到一个MyIt[......]

继续阅读

STL笔记之空间配置器

2014年6月10日 2 条评论

最近看了看侯捷的《STL源码剖析》,打算看完之后写写笔记,毕竟很多东西看起来看懂了,却并不一定能够将其描述清楚,说到底还是没有彻底弄明白,最近博客也基本不怎么写了,所以还是决定写一写,这也算是写博客的乐趣之一吧。这一系列笔记,更主要是写给自己看的:)
1. 初探allocator
其实像我这样的一般人几乎接触不到allocator这种东西,因为这个模板参数是有默认值的,普通用户完全不需要和他打交道。但观察一下allocator这个东西的设计思路,还是可以学到不少东西。先从一个简单的allocat[......]

继续阅读