08 2012 档案
摘要:虚拟构造函数当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你确切地知道想要对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢?例如假设你编写一个程序,用来进行新闻报道的工作,一条新闻报道由文字或图片组成。你可以这样管理它们:class NLComponent { //用于 newsletter components 的抽象基类public: ... //包含至少一个纯虚函数}; class TextBlock: public NLComponent {publi...
阅读全文
摘要:为什么有必要写自己的operator new和operator delete?答案通常是:为了效率。缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块。同样,operator delete也要可以释放任意大小的内存块。operator delete想弄清它要释放的内存有多大,就必须知道当初operator new分配的内存有多大。有一种常用的方法可以让operator new来告诉operator delete当初分配的内存大小是多少,就是在它所返回的内存里预先附带一些额外信息,用来指明被分配的内存块的大小。缺省的operator new和operato
阅读全文
摘要:C++中的new/delete与operator new/operator deletenew operator/delete operator就是new和delete操作符,而operator new/operator delete是函数。new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载operator new(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则 ->如果有new_handler,则调用new_handler,否则 ->如果没要求不抛出异常(以nothrow参数表达
阅读全文
摘要:C++的重载(overload)与重写(override)成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。重写是指派生类函数重写基类函数,是C++的多态的表现,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。示例中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)重写。#include using namespace std;class Base{publ
阅读全文
摘要:The Ethernet header structure is shown in the illustration below: 以太网头部14 bytes Ethernet header structure The IP header structure is as follows: IP头部2
阅读全文
摘要:排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)表示。 A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)! 此外规定0!=1 组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m<=n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号C(n,m) 表示。 C(n,
阅读全文
摘要:24点游戏:输入:n1,n2,n3,n4输出:若能通过+ - * / 和括号混合运算,得到运算结果为24,则输出一个对应的运算表达式穷举法:对4个数字全排列有4!=24种排列。4个数字共需要3个运算符,同一个运算符可以重复出现,则有4x4x4=64种情况。对于4个数字而言,共有以下5中加括号的方式:(A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D)。所以遍历的表达式最多有24*64*5=7680种。即使采用逆波兰表达式,总数不变。/*24点游戏算法,穷举法: f(Array){ if(Array.Length<2) { if(得到
阅读全文
摘要:General Hash Function Source Code:
阅读全文
摘要:寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是第K大的数。可以使用二分搜索的策略来寻找N个数中的第K大的数。对于一个给定的数p,可以在O(N)的时间复杂度内找出所有不小于p的数。寻找第k大的元素:#include <iostream>using namespace std;//快速排序的划分函数int partition(int a[],int l,int r){ int i,j,x,temp; i = l; j = r+1; x = a[l]; //将>=x的元素换到左边区域 //将<=x的元素换到右边区域 while (1...
阅读全文
摘要:会场安排问题问题描述:假设要在足够多的会场里安排一批活动,活动的开始时间和结束时间已知,并希望使用尽可能少的会场。设计一个有效的算法进行安排。分析:这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,就对应要找的最小会场数。 图的最少着色问题,至今没有有效的算法,但这个问题和图的着色问题有不同,活动的时间区间之间的约束关系转化得到的图,属于区间图。我们可以用贪心策略来解决。分析解答:(1)n个活动开始和结束时间分别是s[i]和f[i],s[i]<f[i]。(2)把n个活动时间看做直线上n个区间,把所有的s[i]和f[
阅读全文
摘要:一.八数码问题八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。棋子移动后,状态就会发生改变。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。八数码问题一般使用搜索法来解。搜索法有广度优先搜索法、深度优先搜索法、A*算法等。这里通过用不同方法解八数码问题来比较一下不同搜索法的效果。二.搜索算
阅读全文
摘要:问题许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g“的方式来达到目的。上面的两种方案,都仅需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,给定任意两个字符串,你是否能写出一个算法来计算出它们的距离?分析与解法不难
阅读全文
摘要:题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:15=1+2+3+4+515=4+5+615=7+8有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5;有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢?一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-n*(n-1)/2)%n==0,这样就很容易判断
阅读全文
摘要:问题:给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为19。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。int max_sub_sum1(int a[],int size){ int maxSum = 0; for(int i = 0; i < size; i++ ) for(int j ...
阅读全文
摘要:创建一个使用wpcap.dll的应用程序 用 Microsoft Visual C++ 创建一个使用 wpcap.dll 的应用程序,需要按一下步骤: 在每一个使用了库的源程序中,将 pcap.h头文件包含(include)进来。 如果你在程序中使用了WinPcap中提供给Win32平台的特有的函数
阅读全文
摘要:Dijkstra算法算法流程:(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)<(v,…,w),则以(v,…,u,w)代替。(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。特点:总是按照从小到大的顺序求得最短路径。假设一共有N个节点,出发结点为s,需要一个一维数组prev[N]来记录前一个节点序号,一个一维数组dist[N]来记录从原点到当前节点最短路径(初始值为s到Vi的边的权值,没有则
阅读全文
摘要:1.DFS(深度优先搜索)深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节...
阅读全文
摘要:1、后序表达式求值:后续表达式(逆波兰式)的特点:没有括号。求值方法:从前向后扫,遇到操作数压栈;遇到操作符,从栈中取出2个操作数运算,结果压栈。最终栈中所剩的数为结果。2、中序表达式求值我们先来定义运算符的优先级:(+,-*,/,%从上到下依次升高准备2个栈,一个专门存放运算符,另一个专门存放操作数。1.遇到),那么退栈计算到(为止.结果压栈。2.遇到运算数.那么压栈。3.如果当前运算符优先级低于栈顶运算符.那么计算栈顶运算符并将结果压栈.4.否则压栈.计算带括号和浮点数的表达式:View Code #include<iostream> #include<stack>
阅读全文
摘要:1.判断二叉树是否平衡//求树的高度int TreeDepth(Node* t){ int hl,hr,h; if(t != NULL) { hl = TreeDepth(t->left); hr = TreeDepth(t->right); h = hl>hr? hl:hr; return h+1; } return 0;}//判断二叉树是否平衡int isBalanced(Node* t) { if(t==NULL) return 1; int leftDepth = TreeDepth...
阅读全文
摘要:二叉树的基本操作,都使用递归://二叉树 class Node { public: char data; Node *left; Node *right; Node():data(' '),left(NULL),right(NULL){} Node(char ch):data(ch),left(NULL),right(NULL){} }; //广义表建立二叉树,输入:A(B(D,E(G,)),C(,F))* void CreateBinTree(Node* & Root,char *str) { stack<...
阅读全文
摘要:题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是google的一道面试题。看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下
阅读全文
摘要://优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c...
阅读全文
摘要:单向循环链表:空表:L->next = L。与单链表的联系:判断表尾的方法不同:单链表用p==NULL;循环链表用p==L。双向循环链表:一个结点包含指向后继(next) 和指向前驱(prior) 两个指针,两个方向又分别构成循环链表。双向循环链表的插入和删除:1.p之后插入ss->next = p->next;p->next = s;s->prior = p;s->next->prior = s;2.p之前插入ss->prior= p->prior;p->prior = s;s->next = p;s->prior-&g
阅读全文
摘要:链表:1、注意是否有带头结点。2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。3、单链表的插入、删除操作需要寻找前驱结点。单链表的建立、排序和翻转,都是针对有头结点的单链表。#include <iostream>using namespace std;typedef struct Node{ int data; Node * next;}Node,*List;//顺序建表:尾插法void CreateLinkList(List& L, int n){ // 建立空表 L = (List)malloc(sizeof(Node)); L->next = N...
阅读全文
摘要:先看代码: 1 #include <iostream> 2 using namespace std; 3 4 class A {}; 5 6 class B 7 { 8 public: 9 B(){}10 B(A& a){}11 };12 13 class B1: public B14 {15 public:16 B1(const B& b) : B(b)17 {}18 };19 20 int main()21 {22 A a;23 B b(a);24 B1 b1(a);25 return 0;26 ...
阅读全文
摘要:一道C++笔试题:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。#include <iostream>using namespace std;//只能在堆
阅读全文
摘要:1、字符串数字之间的转换(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->string char *p = "OK"; string str(p);(3)char * -->CString char *p ="OK"; CString m_Str(p); //或者 CString m_Str; m_Str.Format("%s",p);(4)CString --> char * CString
阅读全文
摘要:开博第一篇,hello world!#include <iostream>using namespace std;class say{public: say() { cout << "Hello "; } ~say() { cout << "world!"; }}hello;int main(){ return 0;}使用过下面两个博客,开学找工作,把以前学的一些东西,重新整理一下发布在这里。http://hi.baidu.com/new/xun1573http://blog.csdn.net/luxiaoxun
阅读全文