STL学习
文章平均质量分 68
zk_sima
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
STL中的内存分配方式——1
开始看STL源码分析,最开始讲到allocator,然后侯捷模拟了两种内存分配方式,感觉挺不错的所以记录下来:1. 是分配一块新的内存空间即:利用malloc或者new 来分配新的空间2. 在旧的空间上替换新的值即:placement new例子:inline T* __allocator(ptrdiff_t size,T*) { set_new_handler(0); T* tmp=(T*)(::operator new(size*sizeof(T))); if(0=原创 2011-03-04 16:28:00 · 1209 阅读 · 0 评论 -
选择排序
<br />前面提到了仿函数,那么这里就利用仿函数实现了选择排序:<br />首先定义一个仿函数模板:<br />template<typename T> struct my_larger:public std::binary_function<T,T,bool> { bool operator()(T arg1,T arg2) { return arg1>arg2; } }; <br />然后是选择排序的实现:<br />template<typename Iterator,typ原创 2011-04-02 12:50:00 · 587 阅读 · 0 评论 -
仿函数
<br />仿函数的主要目的是让对象的操作与函数操作一致,然后就是为了能进一步扩展满足一些适配器的操作。<br />所以根据上面2个目的,仿函数有2点需要实现。<br />1. 让对象的操作与函数的操作一致。 那么对象只需要 重载 operator() 就可以了。<br />2.让仿函数能进一步扩展,那么仿函数就必须有共同的规范,比如我们需要 得到 参数类型 和返回类型怎么办,所以为了满足这点需要,我们必须 继承 unarg_function<T,E>(一元操作) 或者继承binary_function<原创 2011-04-01 10:02:00 · 650 阅读 · 0 评论 -
RB Tree的部分实现
<br />跟前面一样,主要是平衡度的问题,RB树是通过节点上的颜色来识别是否平衡的。那么关键是 怎么知道是否平衡,怎么恢复平衡。<br />首先 每个节点有一个成员用于记录节点的颜色:<br />enum Color_node {red=0,black}; template<class T> struct node { typedef node* PVOID ; PVOID parent,l_child,r_child; T key; Colo原创 2011-03-25 14:12:00 · 626 阅读 · 0 评论 -
AVL Tree 的实现
<br />首先 AVL 树是平衡二叉搜索树,所以首先 必须满足搜索树,即l_child值<parent值<=r_child值。这个在前面已经实现了。插入和删除不停的递归就可以。<br />其次 AVL 树是平衡二叉树,他的平衡条件是左右子树的深度之差小于2.而关键问题在怎么计算深度之差。<br />一般的方法都是通过平衡度来衡量的。而平衡度怎么得到呢,一般是通过左右子树的深度差得到。其实别人怎么得到平衡度我也没搞明白,不过在这里我是参考了一中思路,就是在每个节点中 包含它自己的高度,而没有直接包含平衡度。原创 2011-03-22 15:04:00 · 3051 阅读 · 0 评论 -
二叉查询树的实现
因为在关联容器里面主要的内部结构是RB-tree,而红黑树又是一种平衡二叉树,平衡二叉树又是属于二叉查询树,所以按照 侯捷介绍的顺序依次来实现,今天先把二叉查询树这种最简单的实现掉:首先,二叉查询树 不像heap中完全二叉树那样内存分配用线性存储的,二叉查询树一般内部存储是通过链表来实现的,首先来看每个节点的数据结构:template struct node { T value; node* lChild; node* rChild; }; 每个节点都包含了它的孩子节点信息,这样可原创 2011-03-18 13:31:00 · 688 阅读 · 0 评论 -
heap的分析
<br />以前对堆都没什么了解,今天看了书之后才终于明白了,堆其实就是一个完全二叉树,对于查找和排序时间复杂度可以很好的降低:<br />heap分为两种:一种是max-heap一种是min-heap,按照书上的,我们假设为 max-heap,即根节点为最大值:<br />所以:<br />我们的内存分配方式为线性存储,用的是vector。<br />父节点如果位置是 i,那么子节点位置就是2*i+1 和2*i+2;<br />所以如果我们插入一个元素的话,通过跟它的父节点比较,然后依次互换位置。这样就能原创 2011-03-16 12:45:00 · 694 阅读 · 0 评论 -
list的实现
<br />今天由于时间不多,只写了实现了以小部分的,就这样吧:<br />首先节点和迭代器的:迭代器还是跟以前一样需要实现类型接口:<br />template<typename T> struct Node { typedef Node* pointer; pointer pre_node; pointer next_node; T value; }; template<typename T> class list_iterato原创 2011-03-14 21:13:00 · 685 阅读 · 0 评论 -
deque的分析
<br />首先,deque跟vector一样都是支持随机访问的,但是deque跟vector不一样的是deque可以双端进行插入和删除,但是vector不行,表面上看起来这两者数据结构差不错但是实际上相差很大。<br />首先我们假设deque是存取 T类型的数据。<br />它包含了一个T** 类型的指针,这个指针里面内容T*指向一段T类型的存取空间,如果大家看了前面的第二级内存分配就应该可以知道原理是一致的。<br />T** map;<br />所以当我们的一段指向T类型的空间不够时,我们要做的并不原创 2011-03-15 11:16:00 · 539 阅读 · 0 评论 -
vector的实现
<br />有了前面的基础后,我们知道对于特定的容器,我们一般要有对应的iterator与之对应,因为不同的容器,对应不同的数据结构,不同的数据结构对应不同的存取方式,所以也对应了不同的iterator类型。<br />我们知道vector容器对应的iterator肯定是 std::random_access_iterator_tag 类型的,它代表这种迭代器可以随机访问。<br />所以跟前面一样我们的迭代器首先应该实现 相应类型接口:<br />public:<br /> typedef typenam原创 2011-03-11 11:49:00 · 3007 阅读 · 0 评论 -
STL中的内存分配方式——3
前面说到了如果需要的内存空间大于128bytes就是用第一级配置器,那么现在就来看下,如果需要的内存空间小于128bytes的分配方法:第二级配置器。在书中侯捷分析了,对于空间小于128bytes的,把空间分成16种类型的小额区间:8bytes,16bytes,24bytes,32bytes,.....128bytes。如果需要10bytes那么就在16bytes这种类型中取,如果需要n bytes那么就在(n+8-1)&(~7) bytes这种类型里面去。那么这16中类型的小额区间分别是怎么保存地址信息原创 2011-03-08 14:42:00 · 1652 阅读 · 0 评论 -
traits编程思想
<br />首先引用书上的一句话: STL中心思想是把数据容器和算法分开。<br />迭代器是两者结合的关键,那么我们算法当然是通过迭代器来对容器操作了,但是我们在算法中经常需要得到迭代器的相应型别:比如 迭代器说指向的类型。那么怎么得到这些类型呢,当然你可以通过函数模板实现部分功能,也可以通过在迭代器里自定义这些型别。比如:<br />template<...........><br />struct iterator<br />{<br /> typedef T value_type;<br /原创 2011-03-10 15:18:00 · 1286 阅读 · 0 评论 -
STL中的内存分配方式——2
<br />今天又看了点stl源码分析,记下学到的知识<br />构造和析构:(这个跟前面说的方式是一样的)<br />在stl 中 内存分配和构造是分为两个部分的,而精髓是在内存分配中的特别是第二级内存分配,不过这里不涉及到内存分配,只是重复下前面说到的构造和析构:<br />构造:通过 placement new 在给定的一块空间上构造一个新的对象或者赋予新的值。<br />析构:通过调用析构函数来析构掉对象,如果这块空间的内容是has_trivial_destructor类型,那么直接就忽略掉析构。原创 2011-03-07 10:39:00 · 999 阅读 · 0 评论 -
wcout不能输出中文的解决方法
<br />当然我也是从网上找的资料,原理不懂。<br />基本上,如果wcout不能输出中文,只需要加上这句语句就可以:<br />wcout.imbue(locale(locale(),"",LC_CTYPE));<br />原理有待以后再深究,现在就记下解决方案。原创 2011-05-25 15:37:00 · 1288 阅读 · 0 评论
分享