
C++
文章平均质量分 76
linghu_323
杭州电子科技大学
展开
-
位域
位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位转载 2010-09-04 20:29:00 · 742 阅读 · 0 评论 -
关于sizeof
1、什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, associatedwith a variable or a type (including aggregate types). This keywordreturns a value of type size_t. 看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见转载 2010-09-04 20:20:00 · 455 阅读 · 0 评论 -
堆栈的区别
一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始转载 2010-09-04 13:59:00 · 551 阅读 · 0 评论 -
贪心算法(Greedy Algorithm)之霍夫曼编码(Huffman codes)
<br />其实这个霍夫曼编码本身不是一个很难的技巧(也是霍夫曼在期末考试的过程中想出来的方案:)),因为中间用到了贪心的思想,所以也在这里列举了出来。这个问题本身在计算机系的很多教材上都出现过。这里权且记录下来。<br />霍夫曼的编码是这样的。假设我有一组带压缩的文本,里面各个字符出现的频率不同,现在需要对他们进行压缩。比如<br /><br />假设我们有100,000个字符的文本.最直观的压缩办法就是原来每个字符要8个bits。现在我一共只有6个字符,那我就把每个字符用3个二进制位来表示,这样所转载 2010-09-20 21:46:00 · 1861 阅读 · 0 评论 -
二叉树的非递归遍历
<br />#include "stdafx.h"#include "binaryTree.h"#include<list>#include<vector>#include<stack>#include<queue>using namespace std;Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){ if(IsEmpty(T)) return Ok;/*转载 2010-09-20 21:14:00 · 439 阅读 · 0 评论 -
堆栈
<br />堆和栈的区别<br />一、预备知识—程序的内存分配<br />一个由c/C++编译的程序占用的内存分为以下几个部分<br />1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。<br />2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。<br />3、全局区(静态区)(static)—,全局变量和静态变原创 2010-09-20 09:19:00 · 588 阅读 · 0 评论 -
float和double在的存储方式
<br />C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f=2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。<br /> 无论是单精度还是双精度在存储中都分为三个转载 2010-09-16 20:48:00 · 823 阅读 · 0 评论 -
String类的实现
<br />#include <iostream>using namespace std;class String{ friend ostream& operator<< (ostream&,String&);public: String(const char* str=NULL); //赋值构造兼默认构造函数(char) String(const String &other);转载 2010-09-16 20:32:00 · 499 阅读 · 0 评论 -
联合(union)和结构(struct)的区别
<br /> 1. 联合说明和联合变量定义 <br /> 联合也是一种新的数据类型, 它是一种特殊形式的变量。 <br /> 联合说明和联合变量定义与结构十分相似。其形式为: <br /> union 联合名{ <br /> 数据类型 成员名; <br /> 数据类型 成员名; <br /> ... <br /> } 联合变量名; <br /> 联合表示几个变量公用一个内存位置, 在不同的时间原创 2010-09-23 19:07:00 · 1219 阅读 · 0 评论 -
TCP三次握手协议
<br />TCP握手协议<br /> 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。<br /> 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;<br /> 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;<br /> 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认原创 2010-09-24 19:52:00 · 652 阅读 · 0 评论 -
二叉树的非递归遍历
<br />#include <iostream>#include <stack>#include <queue>//#include <aa.h>using namespace std;struct BiTreeNode{ int data; BiTreeNode *lchild; BiTreeNode *rchild; bool flag; BiTreeNode() { data = 0; lchild = NULL; rchild =原创 2010-09-23 18:15:00 · 550 阅读 · 0 评论 -
C 语言的谜题
<br />1、下面的程序并不见得会输出 hello-std-out,你知道为什么吗?<br />#include<br />#include<br />int main()<br />{<br />while(1)<br />{<br />fprintf(stdout,"hello-std-out");<br />fprintf(stderr,"hello-std-err");<br />sleep(1);<br />}<br />return 0;<br />转载 2010-10-18 14:21:00 · 607 阅读 · 0 评论 -
纯虚函数能为private吗?
<br />纯虚函数能为private吗?<br /> --zhuweisky 2003.04.18<br /><br /> <br /> <br /> <br />我们把一个仅仅含有纯虚函数的类称为接口,我们也好像已经习惯了将这个接口中的所有纯虚函数全声明为public,而且按照这样的设计,一切都工作得不错。比如COM正是这样做的,它的接口中几乎不会存在private的纯虚函数。那么,让我们想一想,纯虚函数或者虚转载 2010-10-08 21:51:00 · 1085 阅读 · 3 评论 -
BTree,B-Tree,B+Tree,B*Tree都是什么
B树、B-树、B+树、B*树都是什么B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告转载 2010-10-06 20:41:00 · 764 阅读 · 0 评论 -
什么是P问题、NP问题和NPC问题
什么是P问题、NP问题和NPC问题 这或许是众多OIer最大的误区之一。<br /> 你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问题,NPC问题才是。好,行了,基本上这个误解已经被澄清了。下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题,你如果不是很感兴趣就可以不看了。接下来你可以看转载 2010-09-27 19:37:00 · 852 阅读 · 0 评论 -
(int&)a和(int)a的区别
<br />#include <iostream>#include <string>#include <cstdlib>using namespace std;int main(){ float a = 1.0f; cout << (int)a << endl; cout << (int&)a << endl; cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么? float b = 0.0f;转载 2010-09-28 12:47:00 · 908 阅读 · 0 评论 -
C++ Traits
<br />今天看"modern c++ design"的时候发现自己竟然又把以前好不容易弄懂的Traits技术给忘记了,真是...又重新学习了一下,赶紧记下来。<br />Traits技术可以用来获得一个 类型 的相关信息的。 首先假如有以下一个泛型的迭代器类,其中类型参数 T 为迭代器所指向的类型:<br /><br />template <typename T><br />class myIterator<br />{<br /> ...<br />};<br /><b转载 2010-09-27 09:59:00 · 536 阅读 · 0 评论 -
如何定位放置new
<br />标准首部<new>由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:<br />Widget * p = new Widget; //普通的new pi = new (ptr) int; //placement new<br />括号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placementnew的返回值是这个被构造对象的地址。在对时间要转载 2010-09-27 09:26:00 · 958 阅读 · 0 评论 -
网络字节序和主机字节序
什么是Big Endian和Little Endian?<br />来源:http://blog.ednchina.com/qinyonglyz/194674/message.aspx<br />1.故事的起源<br />“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。<br />我们一般将endian翻译成“字节序”,将big endian和l转载 2010-09-23 18:50:00 · 1301 阅读 · 1 评论 -
析构函数和虚函数
<br />且看下面的例子<br />Class Deriver: public Base <br />{ <br />…; <br />};<br />Base *pb = new Deriver; <br />Delete pb; //子类中含有需要释放的资源时, <br />//如果没有声明virtual ~Base();则会造成内存泄漏. <br /><br /> 在代码设计的时候,如果派生类有自己在heap中申请的空间,而且会用到派生类向基类的转化,那转载 2010-09-20 09:20:00 · 703 阅读 · 0 评论 -
补码的计算
<br />今天用java写个程序中用这样的这一句代码:<br /> int i=6;<br /> ~i;<br />结果~i 的值是 -7,有点不解,随即就有了下面一大堆的说明。<br /> 一看是负数,我就想到负数在计算机中都是以补码形式表示的。大学时学的补码,好久不用现在计算方法都忘记的差不多了。那好,下面先复习一下补码。<br /> 什么事发生我们都要问为什么。那么计算机中为什转载 2010-09-04 20:23:00 · 4758 阅读 · 0 评论 -
构造最优二叉查找树的时间复杂度分析
<br />概念<br /><br /> 二叉查找树(BST,Binary Search Tree),又名二叉搜索树或二叉检索树,是一颗满足如下条件的树: <br /> 1、每个节点包含一个键值 <br /> 2、每个节点有最多两个孩子 <br /> 3、对于任意两个节点x和y,它们满足下述搜索性质: <br /> a、如果y在x的左子树里,则key[y] <= key[x] <br /> b、如转载 2010-09-02 14:30:00 · 5736 阅读 · 0 评论 -
c++实现各种排序算法
<br />#include <iostream>using namespace std;//插入排序void insertion(int a[],int N){ int p,j; for(p = 1; p < N; p++) { int temp = a[p]; for(j = p; j > 0 && a[j-1] > temp; j--) { a[j] = a[j-1]; } a[j] = temp; }}//希尔排序vo原创 2010-08-21 09:35:00 · 509 阅读 · 0 评论 -
二叉树遍历及C语言实现
<br />#include <iostream> #include <string> using namespace std; //存储节点数据,为简便起见,这里选用字符 typedef char DATA_TYPE; typedef struct tagBINARY_TREE_NODE BINARY_TREE_NODE, *LPBINARY_TREE_NODE; struct tagBINARY_TREE_NODE转载 2010-08-18 21:59:00 · 985 阅读 · 0 评论 -
复制构造函数(拷贝构造函数)
也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生。对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制构造函数能解决一些我们常常会忽略的问题。 为了说明复制构造函数作用,我先说说我们在编程时会遇到的一些问题。对于C++中的函数,我们应该很熟悉了,因为平转载 2010-01-11 19:21:00 · 879 阅读 · 0 评论 -
八大排序算法总结
插入排序1.直接插入排序原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。要点:设立哨兵,作为临时存储和判断数组边界之用。实现:Void InsertSort(Node L[],int length){Int i,j;//分别为有序区和无序转载 2009-10-21 12:15:00 · 527 阅读 · 0 评论 -
以下是关于二叉树操作的11个简单算法
#include #include #define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30#ifndef elemType typedef char elemType;#endif/************************************************************************转载 2009-09-15 22:04:00 · 475 阅读 · 0 评论 -
给C++学习的人的50条建议——与有志学好C++的人共勉
今天在网上看到了给C++学习的人的50条建议 :1. 把C++当成一门新的语言学习; 2. 看《Thinking In C++》,不要看《C++变成死相》; 3. 看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看; 4. 不要被VC、BCB、BC、MC、TC等词原创 2009-09-15 21:58:00 · 1053 阅读 · 0 评论 -
C++动态内存创建与内存管理
1 内存空间逻辑组织A 静态数据区:内存在程序启动的时候才被分配,而且可能直到程序开始执行的时候才被初始化,如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整个运行期间都存在,如全局变量,static变量等。注意:初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过void*转载 2009-09-05 15:45:00 · 469 阅读 · 0 评论 -
继承和组合
组合和继承的主要目的是为了代码的重用。组合是将其他类的对象作为成员使用,继承是子类可以使用父类的成员方法。1、构造函数的调用次序:父类的构造函数——>成员对象的构造函数——>子类的构造函数;析构函数调用次序相反。2、名字隐藏:在子类中重新定义类的一个函数,基类中的所有同名的函数被隐藏,重新定义则是指修改父类的函数的操作或者返回值类型。如: class A{ i转载 2009-09-07 16:00:00 · 491 阅读 · 0 评论 -
c++编译器和连接器介绍
c++编译器和连接器介绍 收藏<br /><br />有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。<br /> 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual Studio,Elicpse,Dev转载 2010-08-22 20:56:00 · 792 阅读 · 0 评论 -
字符串函数实现
<br />char * stringcpy(char *dest,const char *src){ assert((dest!=NULL) && (src!=NULL)); char *ret =dest; while((*dest++=*src++)!='/0'){} return ret;}char *stringcat(char *dest,const char *src){ assert((dest!=NULL) && (src!=NULL)); char转载 2010-08-24 21:35:00 · 552 阅读 · 0 评论 -
交换机和路由器的区别
<br />计算机网络往往由许多种不同类型的网络互连连接而成。如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种“互连”并没有什么实际意义。因此通常在谈到“互连”时,就已经暗示这些相互连接的计算机是可以进行通信的,也就是说,从功能上和逻辑上看,这些计算机网络已经组成了一个大型的计算机网络,或称为互联网络,也可简称为互联网、互连网。 <br /> 将网络互相连接起来要使用一些中间设备(或中间系统),ISO的术语称之为中继(relay)系统。根据中继系统所在的层次,可以转载 2010-08-28 21:00:00 · 461 阅读 · 0 评论 -
抽象工厂模式与工厂方法模式区别
<br />对于java来说,你能见到的大部分抽象工厂模式都是这样的:<br />它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。<br />比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。<br />这样A和B就是工厂,对应于抽象工厂;<br />每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;<br />用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微转载 2010-09-11 20:07:00 · 813 阅读 · 0 评论 -
各种排序算法的比较
<br />各种排序算法的比较<br />1.稳定性比较<br /> 插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的<br /> 选择排序、希尔排序、快速排序、堆排序是不稳定的<br />2.时间复杂性比较<br /> 插入排序、冒泡排序、选择排序的时间复杂性为O(n2)<br /> 其它非线形排序的时间复杂性为O(nlog2n)<br /> 线形排序的时间复杂性为O(n);<br />3.辅助空间的比较<br /> 线形排序、二路归并排序的辅助空间为O(n),其它排序的辅助空间为O(1转载 2010-09-10 19:28:00 · 600 阅读 · 0 评论 -
Bloom Filter概念和原理
Bloom Filter概念和原理<br />焦萌 2007年1月27日<br /> <br />Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过转载 2010-09-13 19:22:00 · 500 阅读 · 0 评论 -
抽象类和接口的区别
<br />.Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。<br /> <br />接下来先说说抽象类和接口的区别。<br />区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,转载 2010-09-12 09:19:00 · 440 阅读 · 0 评论 -
稳定排序和不稳定排序
<br />这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 <br /> 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,原创 2010-09-10 19:18:00 · 1125 阅读 · 0 评论 -
指针如何传递内存
<br />指针参数是如何传递内存的?<br />如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1 中,<br />Test 函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,<br />为什么?<br />void GetMemory(char *p, int num)<br />{<br />p = (char *)malloc(sizeof(char) * num);<br />}<br />转载 2010-08-31 09:28:00 · 619 阅读 · 0 评论 -
利用归并实现链表排序
<br />#include <stdio.h>#include "tool.c"#define NULL ((void *)0)struct LinkList{ struct LinkList *next; int value;} *linkList,node;/* try to mergeSort a linkList*/int main(){ void printLinkList(struct LinkList *list);转载 2010-08-30 21:11:00 · 542 阅读 · 0 评论