代码改变世界

随笔档案-2011年12月

哈夫曼压缩算法

2011-12-26 19:41 by 捣乱小子, 33872 阅读, 收藏, 编辑
摘要: 编程独白 给你40分钟的时间,你可以思考十分钟,然后用三十分钟的时间来写代码,最后浪费在无谓的调试上;你也可以思考半个小时,彻底弄清问题的本质与程序的脉络,然后用十分钟的时间来编写代码,体会代码如行云流水而出的感觉。在编程过程当中,相信大家都深有体会,在调试上浪费时间,问题出现在下笔之前没有一个系统 阅读全文

我的第一个MFC小项目(4)之 位图转换(续)

2011-12-20 20:22 by 捣乱小子, 2330 阅读, 收藏, 编辑
摘要: 非常感谢Imageshop的指正,代码有修改,主要是:计算8位位图像素位使用了更高效的整点运算;去除多余的变量检测。求网友们支招:在32位位图中有Alpha值,在转换成8位灰阶位图的时候可以直接省略吗? 在《我的第一个MFC小项目(3)之 位图转换》中,有关于将24位的彩色位图转换为8位的灰阶位图,发散一下就很容易可以得到32位位图彩图转换为8位的灰阶位图,看图:32位位图多出一个Alpha字节,用来描述图片的透明度,根据这一特性,可以将Alpha特意忽略,然后将紧跟其后的RGB按照《我的第一个MFC小项... 阅读全文

STL swap潜在的危险

2011-12-18 19:48 by 捣乱小子, 5421 阅读, 收藏, 编辑
摘要: 背景:在学习C++编程的时候,都使用过标准库(STL)当中的swap,但更多的是swap(int,int)或 者等等一些基本的类型,发散一下是否也可以用来置换自定义的一个类型,比如说某一class(定义一个class相当于定义一个type了),先不从效率上来考虑,看看可行性如何。ps:欢迎讨论。正文:在STL中的swap大概是这样的实现:template<typename T>void swap(T& a,T& b){T temp(a);a = b;b = temp;} 在里面很清楚先先调用T类型的拷贝构造函数构造一个临时变量temp,然后利用这个中间变量将a和b进 阅读全文

(堆的应用)Huffman赫夫曼树的建立

2011-12-15 09:36 by 捣乱小子, 5300 阅读, 收藏, 编辑
摘要: 日后的纠正最近才发现自己的代码有问题,也是在后来做另一个有关哈夫曼实验的时候才发现,在代码当中有很多时候是用new来建立一个新的节点,就包括从最小堆中取出权重最小的节点(这个没有错误),根据两个权重最小节点得出新的节点和往最小堆中插入这个新的节点。问题出在后两个,因为在中间那一步就对left和right设置了parent(看了我的代码的就该很清楚了),其实如果这样下去是很繁琐的,因为new来new去,赋值来赋值去,非常容易搞混。我测试了一下,会把一部分孩子(left或者right)的parent指针搞错,所以今天2011-12-17我更新了Huffman哈夫曼代码。另外值得一提的是,网络上我看 阅读全文

C++对析构函数的误解

2011-12-09 11:56 by 捣乱小子, 15065 阅读, 收藏, 编辑
摘要: C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正。 C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或者赋值;一个良好的class需要有资源回收的机制,而这一操作便落在了析构函数的头上,析构函数来负责类内的资源的free。来看一段代码: class myclass{ public: ... 阅读全文

我的第一个MFC小项目(3)之 位图转换

2011-12-08 16:20 by 捣乱小子, 3455 阅读, 收藏, 编辑
摘要: 关于位图的格式,文件头,信息头,颜色表,像素位等等,我在以前在《我的第一个MFC小项目(2)》有过简单的介绍,当时还操VISIO自己画图呢,不过当时真的非常非常的模糊,甚至还没有灰度图和彩图的概念。没有捧着一本书认真研究,纯粹是完成项目过程当中遇到什么不懂的就直接google...欢迎拍砖,欢迎讨论。8位位图除了可以索引彩色图像外,也可以是灰阶图像,相信更多的是用于灰度的图像,既然有8位的灰阶图像,也就是说从白到黑分成256种渐变,那16位灰阶图像也是存在的,只不过从白到黑分成2^16种渐变;但这是一种很大的浪费我觉得,因为灰阶图像应用不是非常广,在一些专业领域或许会用到。而如今PC下的更多的 阅读全文

C++虚函数和纯虚函数(2)

2011-12-04 16:16 by 捣乱小子, 3816 阅读, 收藏, 编辑
摘要: 书接上文......本来只想看看书就过了,但是最近在看《设计模式》和《effective C++》这两本书,其中将到很多关于C++中封装,继承和多态的思想,所以不得不做一些笔记。关于虚函数,在多态当中,一定要将基类的析构函数设置为虚函数并将其实现,只有这样,才能够达到按对象构造的逆序来析构对象;否则,析构的时候,只会析构基类的那一部分,那么派生类那一部分就无法成功析构了。class shape{public: shape(){}; virtual void draw() = 0; virtual ~shape(){cout draw(); delete s; s ... 阅读全文

C++虚函数和纯虚函数(1)

2011-12-04 13:16 by 捣乱小子, 13930 阅读, 收藏, 编辑
摘要: §写在前面的学习过C++类的继承与多态的时候,但是很多的童鞋回过头来都忘记之中关于虚函数和纯虚函数的细节,甚至将他们混淆。§虚函数虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数);... 阅读全文

C++静态数据成员和静态成员函数

2011-12-03 13:35 by 捣乱小子, 965 阅读, 收藏, 编辑
摘要: 在C++面向对象编程过程当中,对象与对象之间的数据不是共享,在设计类的时候,有时候需要一些对象之间共享的数据,除了把所要共享的数据设置为全局数据或者函数之外,还可以利用C++的静态机制。1、静态数据成员class 类名 { …… static 类型说明符 成员名; …… };静态数据成员是所有对象共享的,其所占的内存空间不会因为某个对象的产生而分配,也不会因为对象的销毁而消失。跟类中其他的非静态数据成员一样,被定义为private时,不能被外界访问。但是可以被类内任意访问权限的函数访问。关于静态数据成员的初始化:非静态成员可以在构造函数当中初始化,但是static不能在构造... 阅读全文