上一页 1 2 3 4 5 6 7 ··· 12 下一页
摘要: 上一篇文章《STL系列》之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现。STL实现源码下载。STL中map的实现是基于RBTree的,我在实现的时候没有采用RBTree,觉得这东西有点复杂,我的map采用的是排序数组(CSortVector)。map中的Ke 阅读全文
posted @ 2014-05-26 14:06 啊汉 阅读(31739) 评论(4) 推荐(3) 编辑
摘要: 最近忙得蛋疼,但还是想写点属于自己的东西。也不知道写点啥,最后决定试着自己实现STL中常用的几个集合,一来加深自己对STL的理解,二来看看自己是否有这个能力实现。实现目标就是:1能和STL兼容;2最大化的实现STL中的接口并保持一致。即将STL中的集合换成我写的也能用。这篇博客介绍的是vector的 阅读全文
posted @ 2014-05-19 21:06 啊汉 阅读(44212) 评论(4) 推荐(3) 编辑
摘要: 前几天看到这样一篇博客《那些年·我们读过的专业书籍》,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,毕竟很多人一年下来也看不了2,3本书,不同的技术能力的人,适合看的书都不太一样,在这么多大家都认为是经典的书中,选出几本真正适合自己的才... 阅读全文
posted @ 2013-12-26 11:32 啊汉 阅读(22717) 评论(60) 推荐(31) 编辑
摘要: 之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就。这个问题,我想简单的说一下内存的分配VS回收&构造函数VS析构函数之间的关系。我的疑问:为什么p出了作用域,指向p的ptr还能读到p中arr的内容,难道p出了作用域,还没有析构?下面的内容会解答这个疑问,先说说跟这篇文章有关的内容。可能是因为平时习惯的原因,我们在实例化一个对象的时候,往往是一条语句实现两个功能:1分配内存;2调用构造函数class A{public: A() { i=0;... 阅读全文
posted @ 2013-11-09 09:43 啊汉 阅读(2824) 评论(10) 推荐(1) 编辑
摘要: 在软件开发中,有些对象使用非常频繁,那么我们可以预先在堆中实例化一些对象,我们把维护这些对象的结构叫“内存池”。在需要用的时候,直接从内存池中拿,而不用从新实例化,在要销毁的时候,不是直接free/delete,而是返还给内存池。把那些常用的对象存在内存池中,就不用频繁的分配/回收内存,可以相对减少内存碎片,更重要的是实例化这样的对象更快,回收也更快。当内存池中的对象不够用的时候就扩容。我的内存池实现如下:#pragma once#include templatestruct ProxyT{ ProxyT():next(NULL){} T data; ProxyT* ne... 阅读全文
posted @ 2013-10-28 08:33 啊汉 阅读(8500) 评论(5) 推荐(4) 编辑
摘要: 我相信很多人对构造函数在什么时候产生,以及产生的原因,理解得不是很透彻;更有甚者认为默认构造函数和复制构造函数是一定会产生的,成员变量就应该在初始化参数列表中进行初始化,当然这些是初学者的认识,下面分享一下我的看法。构造函数不负责分配内存,只是在分配好的一块内存中进行赋值操作.这一点我们可以很容易从new/delete与malloc/free的区别中看出来,malloc/free只负责分配内存不负责初始化,而new/delete不仅负责分配内存,如果对象存在相应的够着函数,就会调用相应的构造函数,如果不存在当然就不调用,如int *i=new int[10];int类型没有构造函数,所以new 阅读全文
posted @ 2013-08-25 16:41 啊汉 阅读(2402) 评论(3) 推荐(2) 编辑
摘要: 我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确定这个方法在方法表中的位置,直接调用就行,在多继承的时候,一个类可能有多个方法表,也就有多个指向这些方法表的指针,一个类有多个父类,怎么通过其中一个父类的指针调用之类的虚方法?其实前面几句话并没有真正说清楚,在单继承中,父类是怎么调用子类的虚方法的,还有多继承又是怎么实现这点的,想知道这些,请认真往下看。我们先看单继承是怎么实现的。先上两个简单的类:#include using namespac. 阅读全文
posted @ 2013-07-25 11:53 啊汉 阅读(3846) 评论(3) 推荐(4) 编辑
摘要: 如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A a,b;&a!=&b。如果一个直接或是间接的继承(不是虚继承)了多个类,如果这个类及其父类像A一样没有方法没有字段,那么这个类的每个实例的大小都是1字节,如果有虚继承,那就不是1字节了,每虚继承一个类,这个类的实例就会多一个指向被虚继承父类的指针。还有一点值得说明的就是像A这样的类,编译器不一定会产生传说中的那6个方法,这些方法只会在需要的时候产生,如class A没有被任何地方 阅读全文
posted @ 2013-07-08 09:13 啊汉 阅读(2896) 评论(2) 推荐(2) 编辑
摘要: 简单介绍一下DataTable。DataTable主要基于表、行、单元格。行用集合包装单元格,表用集合包装行,大致就是这样。DataColumn表示单元格,DataColumn中的字段还挺多的,在实际应用中我们可能只想用它来存一个int型的数据;DataColumnCollection中用一个ArrayList封装DataColumn,表示一些单元格的集合;DataRow直接在DataColumnCollection的基础上提供一些方法,成为行记录。而DataRowCollection则用集合的方式封装DataRow成为表,但它不是以线性、链表等方式,而是基于红黑树RBTree<Data 阅读全文
posted @ 2013-05-31 11:26 啊汉 阅读(6888) 评论(12) 推荐(1) 编辑
摘要: 这是一个基于windows的,用C++编写的客户端服务器程序,适合初学者,高手误入.源码必共享思路是这样的.启动服务器,服务器启动后会创建一个子线程,用于向客户端发送信息.用一个死循环用于接收客户端的请求,客户端请求成功后,会将客户端的连接保存到一个集合中,下面会详细介绍这个保存客户端连接的类.客户端连接成功后,服务器会创建一个子线程用于接收客户端的信息,客户端同样也会创建一个子线程接收服务器的信息.这样客户端和服务器就能进行通讯,如果有哪一方退出,另一方对应的接收数据的线程就会自动终止.退出一个客户端后,服务器对应的接收数据的线程自动终止.如下图:服务器保存客户端连接的集合中会删除对应的客户 阅读全文
posted @ 2013-05-19 17:45 啊汉 阅读(34358) 评论(9) 推荐(6) 编辑
上一页 1 2 3 4 5 6 7 ··· 12 下一页