代码改变世界

随笔分类 -  C++

对象生死劫 - 构造函数和析构函数的异常(转)

2011-10-25 18:15 by Daniel Zheng, 459 阅读, 收藏, 编辑
摘要: 构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存、创建内部对象和打开相关的外部资源,等等。而当对象死亡时,析构函数负责关闭资源、释放内部的对象和已分配的内存。 在对象生死攸关的地方,如果程序代码出现问题,常常会发生内存泄漏,从而产生可能危害系统运行的孤魂野鬼。大量的事实表明,业务逻辑代码写得非常严谨的程序在运行中仍然发现存在内存泄露,大都是构造和析构部分的代码存在问题。 而许多程序员都习惯于面向对象的编程,需要时就建立一个对象,不用时就将其释放。这样的习惯简化了我们的思路,正是面向对象编程思想带来.. 阅读全文

More Effective C++ 学习笔记(2)

2011-09-03 09:53 by Daniel Zheng, 454 阅读, 收藏, 编辑
摘要: 尽量使用C++风格的类型转换 为什么不要使用C风格的类型转换? C风格的类型转换并不代表所有的类型转换功能。 一来它们过于粗鲁,能允许你在任何类型之间进行转换。不过如果要进行更精确的类型转换,这会是一个优点。在这些类型转换中存在着巨大的不同,例如把一个指向const对象的指针(pointer-to-const-object)转换成指向非const对象的指针(pointer-to-non-const-object)(即一个仅仅去除const的类型转换),把一个指向基类的指针转换成指向子类的指针(即完全改变对象类型)。传统的C风格的类型转换不对上述两种转换进行区分。 二来C风格的类型转换在... 阅读全文

二叉树的基本遍历操作

2011-08-25 19:22 by Daniel Zheng, 399 阅读, 收藏, 编辑
摘要: 1 #include <queue> 2 #include <iostream> 3 using namespace std; 4 5 #define QSIZE 100 6 struct BTree 7 8 { 9 int value; 10 struct BTree* lChild; 11 struct BTree* rChild; 12 }; 13 14 void VisitNode(BTree * T) 15 { 16 cout<<T->value<<" "; 17 } 18 BTree * Insert(BTr 阅读全文

动态规划求解0/1背包问题

2011-08-23 18:08 by Daniel Zheng, 2366 阅读, 收藏, 编辑
摘要: 什么是动态规划?动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。动态规划只能应用于有最优子结构的问 阅读全文

递归算法的时间复杂度分析[转]

2011-08-23 10:43 by Daniel Zheng, 712 阅读, 收藏, 编辑
摘要: 递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2+ 2(2T(n/4) + (n/2)2) 还可以继续迭代,将其完全展开可得: T(n) = n2+ 2((n/2)2+ 2((n/22)2+ 2((n/23)2+ 2((n/24)2+…+2((n/2i)2+ 2T(n/2i + 1)))…)))) ……(1) 而当n/2i+1== 1时,迭代结束。 将(1)式小括号展开,可得: T(n) = n2+ 2(n/2)2+ 22(n/22)2+ … + 2i(n/2i... 阅读全文

Fibonacci数列计算的三种方法

2011-08-22 21:38 by Daniel Zheng, 2749 阅读, 收藏, 编辑
摘要: 以下分别用递归,迭代,动态规划求解Fibonacci数列: 1 #include <iostream> 2 #include <ctime> 3 using namespace std; 4 5 int Fibonacci_R(int n) 6 { 7 if((n == 1)||(n == 2)) 8 return 1; 9 else10 return Fibonacci_R(n-1) + Fibonacci_R(n-2);11 }12 13 int Fibonacci_I(int n)14 {15 int A = 1; 16 ... 阅读全文

堆内存和栈内存详解[转]

2011-08-22 16:21 by Daniel Zheng, 689 阅读, 收藏, 编辑
摘要: 堆:顺序随意栈:先进后出堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量 阅读全文

深入理解递归函数的调用过程[转]

2011-08-22 14:36 by Daniel Zheng, 8621 阅读, 收藏, 编辑
摘要: 下面是个关于递归调用简单但是很能说明问题的例子:/*递归例子*/ 1 #include<stdio.h> 2 void up_and_down(int); 3 int main(void) 4 { 5 up_and_down(1); 6 return 0; 7 } 8 void up_and_down(int n) 9 {10 printf("Level %d:n location %p\n",n,&n); /* 1 */11 if(n<4)12 up_and_down(n+1);13 printf("Level %d:n locatio 阅读全文

带头结点的单链表反转

2011-08-22 14:33 by Daniel Zheng, 504 阅读, 收藏, 编辑
摘要: 1 #include <iostream> 2 using namespace std; 3 4 struct Node 5 { 6 public: 7 int data; 8 Node * pNode; 9 };10 11 12 void CreateList(Node * Header)13 {14 cout<<"Input the node data and end by 0"<<endl;15 int input;16 int count = 0;17 Node * oHeader = Header;18 while(cin> 阅读全文

最长公共子序列问题(转)

2011-08-21 22:24 by Daniel Zheng, 329 阅读, 收藏, 编辑
摘要: 转自http://blog.csdn.net/yysdsyl/article/details/4226630动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】求两字符序列的最长公共字符子序列问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定 阅读全文

汉诺塔问题

2011-08-20 01:16 by Daniel Zheng, 11579 阅读, 收藏, 编辑
摘要: 汉诺塔问题是使用递归解决问题的经典范例。 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。这说明了:可以借助B将2个盘子从A移动到C,当然,也可以借助C将2个盘子从A移动到B。如果有3个盘子,那么. 阅读全文

八皇后问题

2011-08-20 01:07 by Daniel Zheng, 422 阅读, 收藏, 编辑
摘要: 八皇后问题是一个国际象棋以为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 我们定义这样的一个一维数组,数组的下标表示第i行,数组的值表示第i列,数组大小为8,把数组初始化为从0到7的八个不同值。相当与对01234567做全排列,这样所以的数字自然不再同一行,同一列,即数组下标的值各不相同,数组的值各不相同,且都是取从0到7的不同值。 现在要解决的就是对角线的问题,如果两个元素处在同一对角线,则有数组下标之差的绝对值等于数组元素值之差的绝对值。即 abs(i-j) 阅读全文

字符串的全排列问题

2011-08-20 00:35 by Daniel Zheng, 390 阅读, 收藏, 编辑
摘要: 对于一个字符串abc, 求它的全排列可以这样分析:第一个字符为a时,bc的全排列第一个字符为b时,ac的全排列第一个字符为c时,ab的全排列对上述各种情况的子串采用相同的方法,直到子串只有一个字符为止,全排列就是它自身。各处代码:void swap(char * a, char * b){ char temp = *a; *a = *b; *b = temp; }void permutation(char *s, int start, int end) //end = strlen(s){ int i; if (start == end) { ... 阅读全文

常见C语言库函数源码

2011-08-18 15:19 by Daniel Zheng, 2129 阅读, 收藏, 编辑
摘要: memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。void * __cdecl memcpy (void * dst, const void * src, size_t count){ void * ret = dst; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret);}void * __cdecl memmove (void * dst, cons 阅读全文

More Effective C++ 学习笔记(1)

2011-08-16 17:13 by Daniel Zheng, 491 阅读, 收藏, 编辑
摘要: 不要对数组使用多态 类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为这样的代码几乎从不如你所愿地那样运行。假设你有一个类BST(比如是搜索树对象)和继承自BST类的派生类BalancedBST:class BST { ... };class BalancedBST: public BST { ... }; 有这样一个函数,它能打印出BST类数组中每一个BST对象的内容:void printBSTArray(ostream& s, con 阅读全文

Understanding Smart Pointers

2011-08-15 23:10 by Daniel Zheng, 315 阅读, 收藏, 编辑
摘要: C++ programmers do not necessarily need to use plain pointer types when managing memory on the heap (or the free store); they can make use of smarter option.What Are Smart Pointers?Very simply said, a smart pointer in C++ is a class, with overloaded operators, which behaves like a conventional point 阅读全文

Working with Bit Flags Using STL

2011-08-15 12:39 by Daniel Zheng, 278 阅读, 收藏, 编辑
摘要: Bits can be very efficient way of storing settings and flags. STL supplies classes that help organize and manipulate bitwise information.The bitset Classstd::bitset is an STL class designed for handling information in bits and bit flags. The std::bitset is not classified as an STL container because 阅读全文

Adaptive Container: stack and queue

2011-08-14 22:53 by Daniel Zheng, 312 阅读, 收藏, 编辑
摘要: The standard template library (STL) features containers that adapt othersto simulate stack and queue behavior. Such containers that internally useanother and present a distinct behavior are called adaptive containers.Using the STL stack ClassThe STL stack is a generic class that allows insertions an 阅读全文

STL Algorithms

2011-08-14 20:25 by Daniel Zheng, 345 阅读, 收藏, 编辑
摘要: One important part of the standard template library is a set of generic functions, supplied by the header <algorithm>. that help manipulate or work with the contents of a container.What Are STL Algorithms?Finding, searching, removing, and counting are some generic algorithmic activities that f 阅读全文

Understanding Function Objects

2011-08-13 00:24 by Daniel Zheng, 301 阅读, 收藏, 编辑
摘要: Function objects or functors might sould exotic or intimidating, but they are entities of C++ that you have probably seen if not also used, without having realized it.The Concept of Function Objects and PredicateOn a conceptual level, function objects are objects that work as function. On an impleme 阅读全文