04 2012 档案

友元类头文件互相包含问题
摘要:原类:class A。友元类:class B。在A.h中声明 friend class B,但不要在A.h中包含B.h, 原类中用了友元类但不包含友元类。在A.cpp中包含B.h,原类的实现文件包含友元类头文件。在B.h及B.cpp中分别包含A.h,友元类的头文件和实现文件都包含原类头文件。有点混乱! 阅读全文

posted @ 2012-04-26 20:48 NLP新手 阅读(1685) 评论(1) 推荐(0)

两个类相互包含对方成员的问题(2)
摘要:1 //A.h文件 2 #ifndef A 3 #define A 4 #include"B.h" 5 static int count=0; 6 class A 7 { 8 public: 9 void fun1( );10 }; 11 #endif12 13 //B.h文件14 #ifndef B15 #define B 16 class A; //注意:这里是C++类的前向声明,没有用include“A.h”把对方加进来是考虑到了没有必要,因为最终两个类是要编译到一块17 class B 18 {19 public:20 void fun2()... 阅读全文

posted @ 2012-04-26 19:42 NLP新手 阅读(495) 评论(0) 推荐(0)

两个类相互包含对方成员的问题
摘要:(源自:http://a117702.blog.163.com/blog/static/327871062009716111134177/)在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型class A{ int i; B b;}class B{ int i; A* a;}请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子:class A{ int i; B b;}class B{ int i; A a;}在这种情况下,想想可以有a.b.a.b.a.b.a.b.a.b…………,很有点 阅读全文

posted @ 2012-04-26 18:10 NLP新手 阅读(733) 评论(0) 推荐(0)

uincode常识
摘要:(源自:http://hi.baidu.com/kbsy/blog/item/3e7d22df859dd1094854037f.html)1.什么是Unicode编码?UNICODE 是目前用来解决 ASCII 码 256 个字符限制问题的一种比较流行的解决方案。大家知道,ASCII 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破 ASCII 码字符数的限制,试图用一种简单的方法来针对超过256个字 阅读全文

posted @ 2012-04-22 08:48 NLP新手 阅读(605) 评论(0) 推荐(0)

输入流seekg()与tellg()用法
摘要:(源自:http://hi.baidu.com/leoyonn/blog/item/450fd465de279dfaf6365433.html)对输入流操作:seekg()与tellg()对输出流操作:seekp()与tellp()下面以输入流函数为例介绍用法:seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:ios::beg:表示输入流的开始位置ios::cur:表示输入流的当前位置ios::end:表示输入流的结束位置tellg()函数不需要带参数,它返回当前定位指针 阅读全文

posted @ 2012-04-22 08:36 NLP新手 阅读(11173) 评论(0) 推荐(0)

string::find()--关键字符串定位
摘要:语法:1 1.size_type source_str.find( const basic_string &str, size_type index );2 2.size_type source_str.find( const char *str, size_type index );3 3.size_type source_str.find( const char *str, size_type index, size_type length );4 4.size_type source_str.find( char ch, size_type index );1、2.返回str在字 阅读全文

posted @ 2012-04-21 15:20 NLP新手 阅读(1835) 评论(0) 推荐(0)

“#if 0/#if 1 ... #endif”的作用
摘要:(源自:http://www.cnblogs.com/MichaelOwen/articles/2128733.html)1.“#if 0/#if 1 ... #endif”的作用,我们知道,C标准不提供C++里的“//”这样的单行风格注释而只提供“/* */”这样的块注释功能,我们通常使用它写代码中说明性的注释文字(注释作用)以及在调试时关闭某段代码对编译器的可见性(屏蔽作用),当然,这里所谓的“注释作用”和“屏蔽作用”是我们从功能上下的主观定义,对预处理器而言,两者并无任何区别。对于前者,因为“注释”中不会再出现“注释”和“需要屏蔽的代码段”,所以不会有嵌套的需求,所以通常不会有问题;而对 阅读全文

posted @ 2012-04-20 20:26 NLP新手 阅读(30858) 评论(2) 推荐(2)

初识lemur--试验indribuildindex命令
摘要:2012年4月17号,我从lemur(狐猴)http://www.lemurproject.org/官网下载了Indri-5.2-install.exe。我开始安装这个软件,过程中选择了一个“full”,安装在D:\lemur\目录下,安装完成后其中有多个文件夹,还有一个license文件和一个uninst卸载程序,就这些东西。经过查看,bin文件夹中是一些C++程序debug后或release后产生的那种应用程序,doc文件夹里是一些html文件,include文件夹里是一些C++头文件,src文件夹里比较复杂,看上去好像是开源的原程序内容。剩下的几个文件夹的内容就不认识了。接下来先说测试i 阅读全文

posted @ 2012-04-18 23:43 NLP新手 阅读(2184) 评论(0) 推荐(0)

头文件如何来关联源文件
摘要:源文件中有#include<~.h>的预处理命令,但是头文件中没有源文件的信息,那么头文件如何来关联源文件呢,曾经这个问题困扰着我。这个问题实际上是说,已知头文件“a.h”声明了一系列函数,“b.cpp”中实现了这些函数,那么如果我想在“c.cpp”中使用“a.h”中声明的这些在“b.cpp”中实现的函数,通常都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎样找到b.cpp中的实现呢?其实.cpp和.h文件名称没有任何直接关系。#include预处理就是完成了一个“复制并插入代码”的工作。编译的时候,并不会去找b.cpp文件中的函数实现,只有在link的时 阅读全文

posted @ 2012-04-16 23:49 NLP新手 阅读(2206) 评论(0) 推荐(0)

#pragma 预处理指令
摘要:pragma,编译指示命令。在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。1.#pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望 阅读全文

posted @ 2012-04-16 22:11 NLP新手 阅读(250) 评论(0) 推荐(0)

#pragma once与 #ifndef的区别
摘要:1.一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 其中#else部分也可以没有,即: #ifdef 程序段1 #denif2.为了避免同一个文件被include多次(1) #ifnde... 阅读全文

posted @ 2012-04-16 21:30 NLP新手 阅读(423) 评论(0) 推荐(1)

宏定义和常量定义的区别
摘要:1.效果-《高质量C++/C编程指南》C++ 语言可以用const 来定义常量,也可以用#define 来定义常量。但是前者比后者有更多的优点:(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。规则5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。2.实现机制宏是预处理命令,即在预编译阶段进行字节替换。const常量是变量,在 阅读全文

posted @ 2012-04-16 21:15 NLP新手 阅读(20815) 评论(3) 推荐(7)

神奇的10个人10个帽子的问题
摘要:题目:10个人10顶帽子,每顶帽子上有1-10中的一个数字,这些数字有可能重复 ,每个人只能看到其他9个人头上帽子上的数字,看不到自己的帽子上的数字 。这时要求每人同时写出一个数字 。问,是否存在一个策略使得,至少有一个人写出的是自己头上帽子的数字?如果存在,请给出一个具体的策略;如果不存在,请给出严格的证明。解:假设每个人帽子上的数字为Xi,i=1,2,...,10。则Xi与Xj是相互独立的,取值完全随机。这里10个人只有1个共性,那就是10个数之和是相同的,记为S。第i个人可以看见其余9个数字,可计算出Si=S-Xi。由此可知对于第i个人而言,Si为已知数,Xi与S为未知数,且Xi+Si= 阅读全文

posted @ 2012-04-15 19:46 NLP新手 阅读(1143) 评论(0) 推荐(0)

完美huffman编码压缩解压缩实现(实现256个ASCII字符)
摘要:1 //<HuffmanGKM.h> 2 #include "stdafx.h" 3 #include <string> 4 5 using std::string; 6 7 const int CHNUM=256; //字符数 8 const int PLUS=128; //字符下标偏移量 9 struct WeightGkm //字符频度结构,包含频度和字符值10 {11 unsigned long w;12 char c;13 };14 typedef struct HTNode //huffman树结构... 阅读全文

posted @ 2012-04-15 09:58 NLP新手 阅读(3572) 评论(0) 推荐(0)

cerr与cout的区别
摘要:(源自:百度百科)概念 std::cerr是ISO C++标准错误输出流,对应于ISO C标准库的stderr。与std::cout不同,ISO C++要求当cerr被初始化后,cerr.flags() & unitbuf非零(保证流在每次输出操作后被刷新),且cerr.tie()返回&cout。[1]即cerr默认和cout同步但无缓冲。cerr与cout的区别 cout对应于标准输出流,默认情况下是显示器。这是一个被缓冲的输出,可以被重定向。 cerr对应标准错误流,用于显示错误消息。默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到 阅读全文

posted @ 2012-04-15 08:06 NLP新手 阅读(2233) 评论(0) 推荐(1)

ofstream和ifstream对ASCII文件的操作
摘要:(源自:http://blog.csdn.net/fireway2009/article/details/7313341)ASCII文件,或称字符文件。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。对ASCII文件的读写操作可以用以下两种方法:(1) 用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。 A、插入器(<<) 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\n' 阅读全文

posted @ 2012-04-14 22:54 NLP新手 阅读(338) 评论(0) 推荐(0)

按位输入文件
摘要:Huffman压缩编码问题,编码问题解决后,剩下的就是如何能够按位操作文件,以真正实现文件压缩。如果只是把编码按char甚至int输入文件,那么得到的压缩文件会更大。但是C语言的文件操作也有其特点,就是无论写入还是读取都是以byte为单位,而不能按位操作。这样一来,就需要我们采取一些特殊手段。比较容易想到的是把要输送的位串以8个bits,即一个byte为单位打包,然后按字节写入。读取时先按照byte读取,然后在根据写入方法的逆,转变成原代码。由于C语言类型的灵活性,对于char类型可以使用移位运算,这就使事情简单多了。假设欲传送的位串,每个位都以char表示,存放于一个char *string 阅读全文

posted @ 2012-04-14 13:27 NLP新手 阅读(326) 评论(0) 推荐(0)

常用头文件-字符处理-<cctype>
摘要:<cctype>中定义的函数:isalnum(a) 如果c是字母或数字,则为true。isalpha(a) 如果c是字母,则为true。iscntrl(c) 如果c是控制字符,则为true。isdigit(c) 如果c是数字,则为true。isgraph(c) 如果c不是空格,但可打印,则为true。islower(c) 如果c是小写字母,则为true。isprint(c) 如果c是可打印的字符,则为true。ispunct(c) 如果c是标点符号,则为true。isspace(c) 如果c是空白字符,则为true。isupper(c) 如果c是大写字母,则为true。is... 阅读全文

posted @ 2012-04-13 13:00 NLP新手

流提取运算符( >> )过滤空白符
摘要:流提取运算符( >>)过滤空白符 阅读全文

posted @ 2012-04-12 21:56 NLP新手

动态规划01背包算法
摘要:1 int Bag01( int m,int n,int w[], int p[] )//n为背包容量,m为物品数量;w[] 为物品的重量;p[]为物品的价值 2 { 3 int c[10][100];//最优子结构矩阵,m<10,n<100 4 int i,j; 5 for( i=0;i<10;i++ ) 6 for( j=0;j<100;j++ ) 7 c[i][j]=0; 8 9 for( i = 1;i < n+1;i++ )10 for( j = 1;j < m+1;j++ )11 {12 ... 阅读全文

posted @ 2012-04-09 23:33 NLP新手

在时间复杂度O(logn)下求Fibonacci数列
摘要:时间复杂度为O( n )的方法:long long Fibonacci( unsigned n ) { int result[2] = {0, 1}; if(n < 2) return result[n]; long long fibOne = 0; long long fibTwo = 1; long long fibThree ; for(unsigned int i = 2; i <= n; ++ i) { ... 阅读全文

posted @ 2012-04-07 10:22 NLP新手

圆圈中最后剩下的数字--约瑟夫环问题
摘要:用环形链表实现约瑟夫环问题 1 typedef struct node 2 { 3 int data; 4 struct node * next; 5 }Node, *Link; 6 7 Link create(int n) //生成环形链表 8 { 9 Link head, rear ;10 Link p = new Node; //第n个节点11 p->data = n;12 head = rear = p;13 for( int i=n-1; i>0; i-- ) //从前面插入n-1个节点,注意,单项链表是便于逆向顺序构成的。 ... 阅读全文

posted @ 2012-04-07 09:20 NLP新手

在一个字符串中找到第一个只出现一次的字符
摘要:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 1 const int N = 256 ; 2 void Function( char * str , int * hash ) 3 { 4 char * p = str ; 5 while( *p ) 6 { 7 hash[ *p ]++ ; //自增 8 p++ ; 9 } 10 p = str;11 while( *p ) //扫描第二遍,当扫描都出现次数为1的字符,即停止 12 ... 阅读全文

posted @ 2012-04-06 23:00 NLP新手

求二叉排序树的镜像
摘要:传递指针变量给函数调用时,是用按值传递的方式把指针值(地址)传递给函数,函数通过指针直接操作原变量。这个过程中是无法修改指针的。如,要实现修改T->lchild,使得,T->lchild = p,在function( T->child, p ) 中是实现不了的,应该对采用引用传递,或传递指针的指针。题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入: 8 / \ 6 10/ \ / \5 7 9 11输出: 8 / \ 10 6/ \ / \11 9 7 5 定义二元查找树的 阅读全文

posted @ 2012-04-06 21:50 NLP新手

求1+2+…+n变态问题的两个很棒的解法
摘要:题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。第一种方法: 1 class Sum 2 { 3 public: 4 Sum() 5 { 6 n++; 7 sum+=n; 8 } 9 void Result()10 {11 cout<<sum<<endl;12 } 13 private: 14 static int sum=0; //类中的静态变量是属于类的,不属于某个对象!不能在定义对象时对变量初始... 阅读全文

posted @ 2012-04-06 19:19 NLP新手

翻转句子中单词的顺序
摘要:题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:翻转“I am a student.”中所有字符得到“.tneduts a ma I”,再翻转每个单词中字符的顺序得到“students. a am I”,正是符合要求的输出。 1 void Function( char * str ) 2 { 3 int len = strlen( str ); 4 Reverse( str, str+len-1 ); 5 6... 阅读全文

posted @ 2012-04-06 16:44 NLP新手

判断整数序列是不是二元查找树的后序遍历结果
摘要:题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11 因此返回true。 如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 思路:后序遍历结果数组的最后一个元素为根节点。 根节点的左子树全部小于根节点 根节点的右子树全部大于根节点 递归遍历左右子树是否二叉树 1 bool IsSearchBinaryTree( int a[ ], int n ) // a 为序.. 阅读全文

posted @ 2012-04-06 15:34 NLP新手

转换矩阵
摘要:转换基:1.基向量是否单位化,即是否是带权转换基,2.基向量是否正交化,即转换效果是否保持原方向3.转换基是否可逆,即是否是降维转换,降维转换是不可恢复的转换 阅读全文

posted @ 2012-04-06 12:28 NLP新手

给定数组,查找最小的k个元素或最大的k个元素 快速排序算法灵活应用
摘要:假定有这样一组数列{ 10, 33, 2, 4, 55, 6, 12, 34, 456, 66, 43, 23, 65, 1, 345, 61, 76, 31, 43, 76 };如和求出最小的k个值,或最大的k个值?借鉴快速排序算法,下面是本科教材《数据结构》中的快速排序: 1 void QuickSort ( int A[ ], int head, int rear ) 2 { 3 int pivot; 4 if( head < rear ) // 肯定为真的条件 5 { 6 pivot = Partition ( A, head, rear ); 7 Qui... 阅读全文

posted @ 2012-04-04 23:33 NLP新手

在二元树中找出和为某一值的所有路径
摘要:(回溯算法) 1 typedef struct BiTNode 2 { 3 int data; 4 BiTNode * lchild; 5 BiTNode * rchild; 6 }BiTNode, * BiTree; 7 8 void Function( BiTree T, int sum ) 9 {10 int path[ MAXSIZE ];11 FindPath( T, sum, path, 0 );12 }13 14 void FindPath( BiTree P, int sum, int path[], int top )15 {16 if( p )17... 阅读全文

posted @ 2012-04-04 17:21 NLP新手

最大连续子序列之和问题
摘要:(源自算法分析课件)长度为n的数组有n2个子序列,长度为n的序列求和时间复杂度为O(n),这样穷举求解的方法是与本题无关的,呵呵。 1 int maxSubSequenceSum( int a[ ], int n ) 2 { 3 maxSum = 0; 4 subSum = 0; 5 6 for ( j = 0; j<n; j++ ) // i 是subSum的起始位置,j 是subSum的结束位置 7 { 8 subSum += a[ j ]; /* subSum是从始至终一直在累加的,当为负时归0。 9 而maxSum就是整... 阅读全文

posted @ 2012-04-04 15:01 NLP新手

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)
摘要:1 #define STACK_LEN 50 2 3 typedef struct 4 { 5 int data; 6 7 int min; 8 } StackItem; 9 10 typedef struct 11 { 12 StackItem data[ STACK_LEN ]; 13 int top; 14 } Stack; 15 16 void push( stack *S, int val ) 17 { 18 S->data[ S->top ].data = va... 阅读全文

posted @ 2012-04-04 13:27 NLP新手

中序线索二叉树算法 解决 把二元查找树转变成排序的双向链表
摘要:1.中序线索二叉树算法,源自本科教材《数据结构》typedef struct ThreadTNode{ elemtype data; struct ThreadTNode *lchild, *rchild; int ltag, rchild;}ThreadTNode, *ThreadTree void CreateInThread ( ThreadTree T ){ ThreadTree pre = NULL; if( T != NULl ) { InThread( T, pre ); pre->rchild = NULL; pre->rtag ... 阅读全文

posted @ 2012-04-04 10:26 NLP新手

一种很棒的二叉树非递归后序遍历方法
摘要:( 源自:百度知道。 我承认,我对这个设计非常非常欣赏,尤其是else while 的设计,很好的体现了后序遍历的特点) 1 void PostOrder( BiTree T) 2 { 3 InitStack( S );//初始化栈 4 BiTree p = T; // 遍历指针、入口地址 5 unsigned sign;//记录结点从栈中弹出的次数 6 7 while( p || !IsEmpty( S ) ) 8 { 9 if( p )10 {11 Push( p ); //第一次遇到结点T... 阅读全文

posted @ 2012-04-03 20:10 NLP新手 阅读(358) 评论(0) 推荐(0)

导航