STL源码剖析
ruan875417
这个作者很懒,什么都没留下…
展开
-
【STL源码剖析读书笔记】【第1章】STL概论与版本简介
一、STL六大组件:1、容器(containers):各种数据结构,如:vector、list、deque、set、map,主要用来存放数据。2、算法(algorithms):各种常见算法,如:sort、search、copy、erase......3、迭代器(iterators):扮演算法和容器中的胶合剂,是“泛型指针”。所有STL容器均有自己专属的迭代器。4、仿函数(funct原创 2015-04-29 15:52:43 · 730 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现priority_queue之MyPriorityQueue
MyHeap.h#ifndef MY_HEAP_H#define MY_HEAP_H#include#include#define max_value 99999999//仿函数templatestruct MyLess{ bool operator()(const T& x, const T& y) const { return x < y; }};template原创 2015-05-31 14:49:00 · 510 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现queue之MyQueue(底层用MyList)
MyList.h#ifndef MY_LIST_H#define MY_LIST_H#include//list的node结构templatestruct list_node{ typedef list_node* pointer; pointer prev; pointer next; T data;};//list的iteratortemplatestruct原创 2015-05-29 20:18:56 · 679 阅读 · 1 评论 -
【STL源码剖析读书笔记】【第5章】关联式容器之RB-tree
1、二叉树:任何节点最多只有两个子节点,这两个子节点分别称为左子节点和右子节点。2、二叉搜索树:任何节点的键值一定大于其左子树中的每一个节点的键值,小于其右子树中的每一个节点的键值。原创 2015-05-18 11:40:08 · 994 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第5章】关联式容器之set、map、multiset和multimap
一、set1、 set的特性是所有元素都会根据元素的键值自动排序,set元素的键值就是实值,实值就是键值。2、 不能通过set的迭代器改变set的元素,setiterators是一种constant iterators。3、 客户端对set进行元素新增或者删除操作时,操作之前的所有迭代器在操作后都依然有效,被删除的元素的迭代器例外。4、 STL set以RB-tree为底层原创 2015-05-18 14:04:06 · 515 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现Heap算法之MyHeap(底层容器用vector)
MyHeap.h#ifndef MY_HEAP_H#define MY_HEAP_H#include#include#define max_value -99999999//仿函数templatestruct MyLess{ bool operator()(const T& x, const T& y) const { return x < y; }};template原创 2015-05-30 18:47:01 · 751 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第6章】算法之power算法
开始看power函数的版本二时,有点迷糊,这里用了十进制数的二进制表示法。十进制数,这里n0,n1,n2,…,nk等于0或1,则。举个例子: 13=20+22+23=(1101)2,令result初始值为1,因此要计算xn,只要将n化为二进制并由低位到高位依次判断,如果第i位为1,则。int power(int x, unsigned n){ if (n == 0原创 2015-05-22 19:12:29 · 439 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第6章】算法之set相关算法
1、 STL提供了4个set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。2、 set相关算法源代码//并集,求存在于[first1, last1)或存在于[first2, last2)内的所有元原创 2015-05-23 15:18:18 · 417 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第6章】算法之copy算法
由于copy进行的是复制操作,而复制操作不外乎用assignment operator或copy constructor(copy算法用的是前者),但是某些元素型别拥有的是trivial assginment operator,因此,如果能够使用内存直接复制行为(例如C标准函数memmove或memcpy),便能够节省大量时间。为此,SGI STL的copy算法用尽各种办法,包括函数重载、型别特性原创 2015-05-23 13:12:31 · 479 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第6章】算法之partition算法
1、partition将区间[first, last)中的元素重新排列。所有被一元条件运算pred判定为true的元素,放在区间的前段,判定为false的元素,放在区间的后段。该算法并不保证元素的原始相对位置。2、partition源代码template BidirectionalIterator partition(BidirectionalIterator first, Bidir原创 2015-05-23 21:56:07 · 481 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第6章】算法之rotate算法
1、 rorate函数将[first, middle)内的元素和[middle, last)内的元素互换,middle所指元素成为容器的第一个元素。rotate函数为了追求效率,根据迭代器的移动能力将其分三种情况进行讨论:分别为ForwardIterator, BidirectionalIterator和RandomInterator。2、 ForwardIterator版本// r原创 2015-05-24 14:03:49 · 814 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第6章】算法之inplace_merge算法
1、 inplace_merge()函数将两个连接在一起的排序序列[first, middle)和[middle, last)结合成单一序列并保持有序。inplace_merge()函数是stable操作。2、 inplace_merge()版本一的源代码,只讨论了有暂时缓冲区的情况template inline void inplace_merge(BidirectionalIte原创 2015-05-26 10:37:05 · 2996 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第7章】仿函数
1、 仿函数也叫作函数对象,是一种具有函数特质的对象,调用者可以像函数一样地调用这些对象。仿函数必须重载operator()。2、 STL中仿函数代替函数指针的原因在于函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求,函数指针无法与STL其他组件搭配。3、 STL仿函数与STL算法之间的关系:4、 为了拥有配接能力,每一个仿函数必须定义自己的相应型别原创 2015-05-26 11:47:56 · 494 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现list之MyList
MyList.h#ifndef MY_LIST_H#define MY_LIST_H#include#include//list的节点结构templatestruct list_node{ typedef list_node* pointer; pointer prev; pointer next; T data;};//list的iteratortemplate原创 2015-05-29 14:50:47 · 591 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现stack之MyStack(底层用MyList)
MyList.h#ifndef MY_LIST_H#define MY_LIST_H#include//list的node结构templatestruct list_node{ typedef list_node* pointer; pointer prev; pointer next; T data;};//list的iteratortemplatestruct原创 2015-05-29 18:22:54 · 664 阅读 · 0 评论 -
【STL源码剖析读书笔记】STL容器迭代器失效问题总结
一、vector1、当push_back一个元素后,若capacity大小与push_back前相比不变,则end操作返回的迭代器失效;若capacity大小与push_back前相比增大了,说明引起了内存重新分配,原来的内存被释放了,此时所有迭代器全部失效;3、当insert一个或多个元素后,若capacity大小与insert前相比不变,则指向插入点及之后的所有迭代器全部失效;若cap原创 2015-05-21 20:46:22 · 542 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第2章】空间配置器
1、 allocator是空间配置器而不是内存配置器,空间不一定是内存,也可以是磁盘或其它辅助存储介质。但SGI STL提供的配置器配置的对象是内存。2、 SGI标准的空间配置器,std::allocatorSGI定义了一个符合部分标准,名为allocator的配置器,效率不高,只把c++的::operator new和::operator delete做了一层薄薄的包装,SGI没有用原创 2015-05-02 16:32:33 · 757 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第4章】序列式容器之deque
1、deque概述deque是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作。deque没有容量的概念,它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。2、deque的中控器deque由一段一段的定量连续空间构成。一旦有必要在dequer前端或尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。原创 2015-05-11 20:15:08 · 436 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第3章】迭代器概念与traits编程技法
1、迭代器模式:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该聚合物的内部表达式。2、STL的中心思想:将数据容器和算法分开,彼此独立设计,最后用迭代器将它们撮合在一起。3、迭代器是一种智能指针,最终要的编程工作就是对operator*和operator->进行重载工作。原创 2015-05-05 09:47:54 · 669 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第4章】序列式容器之stack和queue
一、stack1、stack概述stack是一种先进后出(First In LastOut,FILO)的数据结构,它只有一个出口。stack允许新增元素,移除元素、取得最顶端元素,但不允许有遍历行为。由于stack系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,称为adapter(配接器)。2、SGI STL以deque作为缺省情况下的sta原创 2015-05-13 13:59:04 · 513 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第4章】序列式容器之vector
1、vector概述vector是动态空间,随着元素的加入,它内部机制会自行扩充空间以容纳新元素。vector的实现技术,关键在于其对大小的控制及重新配置时的数据移动效率。2、vector的迭代器vector的迭代器是普通指针,支持随机存取,提供的是RandomAccess Iterators。原创 2015-05-06 18:37:01 · 608 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第4章】序列式容器之heap和priority_queue
一、heap1、heap概述heap并不归属于STL容器组件,扮演priority queue的助手,binary max heap适合作为priority queue的底层机制。binary heap是一种completebinary tree,整棵binary tree除了最底层的叶子节点外是填满的,而最底层的叶子节点由左至右不得有空隙。利用array来存储complete原创 2015-05-16 10:03:29 · 587 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第5章】关联式容器之hashtable
1、hashtable在插入、删除、搜寻操作上具有“常数平均时间”的表现,不依赖输入元素的随机性。2、hashtable通过hash function将元素映射到不同的位置,但当不同的元素通过hash function映射到相同的位置时,便产生了“碰撞”问题。解决碰撞问题的方法主要有线性探测、二次探测、开链法等。3、线性探测当hash function计算出某个元素的插原创 2015-05-20 13:44:50 · 494 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第4章】序列式容器之list和slist
一、list1、list概述list是双向链表,对于任何位置的元素插入或元素移除,list永远是常数时间。2、list的节点list本身和list节点是不同的数据结构,需要分开设计。STL list的节点结构:template struct __list_node { typedef void* void_pointer; void_pointer next; v原创 2015-05-08 10:58:26 · 596 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现简单的空间配置器MyAllocator
MyAllocator.h#ifndef MY_ALLOCATOR_H#define MY_ALLOCATOR_H#include //placement new#include //ptrdiff_t size_t//分配内存templateinline T* _allocator(ptrdiff_t n,T*){ T* temp = (T*)(::operator new(原创 2015-05-27 18:55:56 · 666 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第8章】配接器
1、 设计模式中对配接器的定义如下:将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes可以一起运作。2、 容器配接器stack和queue是两个容器配接器,底层默认由deque构成。stack封住了所有的deque对外接口,只开放符合stack原则的几个函数;queue封住了所有的deque对外接口,只开放符合queue原则的几个函数。原创 2015-05-27 10:12:38 · 605 阅读 · 0 评论 -
【STL源码剖析读书笔记】自己实现vector之MyVector
MyVector.h#ifndef MY_VECTOR_H#define MY_VECTOR_H#define _SCL_SECURE_NO_WARNINGS //为了防止在VS2013中报错#include //ptrdiff_t#includetemplatevoid destroy(T* ptr){ ptr->~T();}templatevoid destroy(原创 2015-05-28 15:07:21 · 1325 阅读 · 0 评论 -
【STL源码剖析读书笔记】【第5章】关联式容器之hash_set、hash_map、hash_multiset和hash_multimap
一、hash_set1、hash_set以hashtable为底层机制,hash_set的操作几乎都是转调用RB-tree的函数而已。2、hash_set的元素没有自动排序功能。3、hash_set的使用方式与set完全相同。4、测试例子#include#includeusing namespace std;int main(){ int ia[] = { 1, 4,原创 2015-05-21 13:36:31 · 569 阅读 · 1 评论 -
【STL源码剖析读书笔记】【第6章】算法之next_permutation和prev_permutation算法
1、next_permutation()会取得[first, last)所标示序列的下一个排列组合,如果没有下一个排列组合,返回false,否则返回true。2、next_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i 3、next_permutation()源代码template bool next_per原创 2015-05-25 10:10:52 · 399 阅读 · 0 评论