C/C++
文章平均质量分 78
zsuguangh
这个作者很懒,什么都没留下…
展开
-
使用Vector实现二维数组
<br />from: XHeartBlue.home.chinaren.com <br /><br />用vector取代C-style的数组 <br /> 提起数组,大家想必都很熟悉,你可以用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是你知道它有许多天生的缺陷吗? <br /> 首先,数组的越界可能会引起程序的崩溃(如果崩溃了,还算你走运^_^)。其次是动态性不好,包括动态改变大小,动态申请。诸如此类的事,一定会让你伤透脑筋。有什么办法可以解决转载 2011-01-13 16:49:00 · 78693 阅读 · 6 评论 -
C/C++中字符指针数组及指向指针的指针的含义
<br />转自:http://www.pconline.com.cn/pcedu/empolder/gj/c/0503/564467.html<br />就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。<br /><br /> 先看下面的代码,注意看代码中的注解:<br />#include <iostream> <br />#include <string> <br />using namespace std; <br />转载 2011-05-13 10:48:00 · 758 阅读 · 0 评论 -
智能指针
<br /> 转自:百度百科<br /> 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。 <br /> 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。 <br /> 每次创建类的新对象时,初始化指针并将引用计转载 2011-03-25 17:27:00 · 636 阅读 · 0 评论 -
UNIX 进程揭秘
<br />转自:http://www.ibm.com/developerworks/cn/aix/library/au-unixprocess.html#listing6<br />分配给系统管理员的许多工作之一是确保用户的程序正确运行。因为系统上存在其他并发运行的程序,所以此任务变得更加复杂。由于种种原因,这些程序可能会失败、挂起或行为异常。在构建更可靠的系统时,了解 UNIX® 环境如何创建、管理和销毁这些作业是至关重要的步骤。<br />开发人员还必须积极了解内核如何管理进程,因为与系统的其他部分和转载 2011-05-13 14:33:00 · 694 阅读 · 0 评论 -
sizeof使用
假设有如下代码:#includeusing namespace std;class A{};class B{ int i;};class C{ void print(){}};class D{ virtual void print(){}};class E{ virtual void print(){} int i;};class F{ virtual void print(){} int i; char* p;};cl原创 2011-03-26 01:34:00 · 739 阅读 · 0 评论 -
C++中的虚函数
虚函数的定义: 虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public(可以定义为private or proteceted, 但是对于多态来说,没有意义。),在基类的类定义中定义虚函数的一般形式: virtual 函数返回值类型 虚函数名(形参表) { 函数体 }定义虚函数的限制: (1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将转载 2011-04-17 00:09:00 · 980 阅读 · 0 评论 -
c/c++中内存区域划分大总结
<br />转自:http://c.chinaitlab.com/cc/basic/200906/787241.html<br />一、 在c中分为这几个存储区<br /> 1.栈 - 由编译器自动分配释放<br /> 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收<br /> 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放<br />转载 2011-04-18 22:18:00 · 610 阅读 · 0 评论 -
编程之美2.14 求数组的子数组之和的最大值
<br />问题描述:<br />一个有N个整数元素的一维数组(A[0],A[1],...A(n-1),它包含很多子数组,求子数组之和的最大值,当数组元素全部为负的时候,有两种处理办法,第一种是返回0,第二种是返回数组中最大的负数。<br />解法1:<br />使用暴力法,假设最大的一段数组为A[i],...,A[j],则对i:=0~n-1 j:=i~n-1,遍历一遍,求出最大的Sum(i,j)即可<br />解法2:<br />使用分治法,数组(A[0],A[1],...A(n-1)分为长度相等的两段数原创 2011-04-20 20:05:00 · 2711 阅读 · 2 评论 -
More Effective C++:指针与引用的区别
<br />转自:http://dev.yesky.com/495/2567995.shtml<br />指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?<br /><br /> 首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明转载 2011-04-22 00:37:00 · 618 阅读 · 0 评论 -
编程之美2.5 寻找最大的K个数
/********************问题描述************************有若干个无序的数(假设数目为N),如何选择其中最大的K个数*****************************************************/#include#include#includeusing namespace std;/***********************解法一:全部排序**************将输入的N的数排序,然后选出原创 2011-04-21 21:41:00 · 2482 阅读 · 2 评论 -
编程之美2.14扩展问题2 求数组的子数组之和的最大值并给出子数组的起始终止位置
<br />求子数组之和的最大值采用之前的博客编程之美2.14 求数组的子数组之和的最大值中的动态规划方法,时间复杂度为O(N),在求nAll的过程中,记录子数组和最大值的那个数组的起始位置start跟终止位置end,下面的源码也分成了两种情况处理,一种情况是数组元素全为负的时候返回最大的负数,数组中除了0就是负数的情况则返回最后一次出现的那个0所在的位置(对应于程序的define RETURN_MAXMINUS块);另外一种情况是数组元素全为负数的时候返回0并置start跟end为-1,数组中除了0就是负原创 2011-04-21 00:21:00 · 2810 阅读 · 0 评论 -
编程之美2.14扩展问题1 求子数组和的最大值(首尾可以相连)
<br />整体思路:<br />问题的解可以分为两种情况:<br />1)解没有跨过A[n-1]到A[0],即普通的求子数组和的最大值<br />2)解跨过A[n-1]到A[0]<br />对第二种情况,只要找到从A[0]开始和最大的一段(A[0],...,A[j])(0<=j<n)以及A[n-1]结尾的和最大的一段(A[i],...,A[n-1])(0<=i<n),那么第2种情况中,和的最大值M_2为:<br />M_2=A[i]+...A[n-1]+A[0]+...+A[j]<br />如果i<=j,原创 2011-04-21 11:15:00 · 2716 阅读 · 4 评论 -
编程之美2.17 数组循环移位
<br />问题描述<br />把一个含有N个元素的数组循环右移K位,如K=4的时候abcd1234->1234abcd。一般考虑K>0的情况,即右移;同时K<N,当然K>=N的话可以通过K%=N得到一样的结果<br /> <br />解法思路详见代码注释<br />/****************************问题描述*****************************把一个含有N个元素的数组循环右移K位,如K=4的时候abcd1234->1234abcd一般考虑K>0的情况,即原创 2011-04-22 00:22:00 · 1370 阅读 · 0 评论 -
设计包含min函数的栈
本文转自:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排转载 2011-06-15 11:54:00 · 999 阅读 · 0 评论 -
编程之美3.9 重建二叉树
<br />问题描述:给定一个前序遍历和一个中序遍历,重建一棵二叉树。如:<br />前序:a b d c e f<br />中序:d b a e c f<br />a是根节点。<br />思路:根据前序,可以很快找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f即可<br />#include<iostream>using namespace std;//定义树的长度#define TREELEN 6转载 2011-04-28 00:59:00 · 1681 阅读 · 0 评论 -
编程之美3.8 求二叉树中节点的最大距离
<br />转自:http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html问题定义<br />如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。<br />书上的解法<br />书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。<br />计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到转载 2011-04-27 21:22:00 · 1278 阅读 · 0 评论 -
编程之美 2.1 求一个数的二进制表示中1的个数
<br />/**************问题描述************求二进制数中1的个数**********************************/#include<iostream>using namespace std;/****************解法一:直接除2*******************对num除以2,余数为1则result加1,时间复杂度为O(logv)v为num的二进制位数**************************原创 2011-04-30 02:02:00 · 1336 阅读 · 0 评论 -
编程之美 2.2阶乘中最低位0的个数&二进制表示中最低位1的位置
<br />/***************************问题描述**************************1. 给定一个整数N,那么N的阶乘N!末尾有多少个0?2. 求N!的二进制表示中最低位1的位置*************************************************************//************************问题1思路****************************N!=K*powe原创 2011-05-03 00:48:00 · 2192 阅读 · 1 评论 -
C++指针之对未声明的地址进行访问
<br />例1、<br />下列代码的运行结果是什么?<br />int *ptr;<br />ptr=(int *)0x8000;<br />*ptr=3;<br />解答:指针问题,首先将指针ptr指向一个指定的地址,即对一个未作声明的地址直接进行访问,所以访问出错。这块地址可能已经被用,或者被其他程序占用等,因此会导致错误。<br /> <br />例2、<br />下面这个程序在哪一行会崩溃?<br />struct S<br />{<br /> int i;<br /> int *p;<转载 2011-03-22 12:10:00 · 3229 阅读 · 1 评论 -
KMP模式匹配算法
<br />#include<iostream>#include<cstring>using namespace std;//返回字符数组p的每一位的最长公共字串的位置int* Next(char* p){ int tmplen=strlen(p); int* N=new int[tmplen]; N[0]=0; for(int i=1;i<tmplen;i++){ int k=N[i-1]; while(k>0&&p[i]!=p[k]) k=N[k-原创 2011-03-17 22:08:00 · 632 阅读 · 0 评论 -
C++中struct和class的区别
有很多人在学习C++的时候只是了解了C++的语法,或者更高层次的人是理解了oo,但在这样的学习过程中,往往一些最基本的问题反而被忽略了。当然,这些问题或许在你做工程中,不会有太大的影响,只要按照平时一贯的良好编码习惯,依旧可以写出好的代码;但某些时候,或许就是这些最基本的小问题,会让你的程序BUG难以发现,而注意到某些问题后,同时还将会提升你程序的性能。所以,还是让我们把这些最基本的问题一一拾起,了解总比不了解好。<br />我原本打算用最俗的方式列出10个最基本的问题来排个TOP10的,后来发现每个问题要转载 2011-01-18 15:24:00 · 1315 阅读 · 0 评论 -
Main参数介绍及使用
本文转自http://www.programfan.com/blog/article.asp?id=39240main参数 C语言中的main函数,一般会带有2个参数,例如int main ( int argc, char* argv[]),这是一个典型的main函数的声明。这是为了在执行程序时需要向程序传递参数,参数argc代表了输入参数的个数,char *argv[]表示传入的参数的字符串,是一个字符串数组。例如在Unix平台下编写一个小程序:int main(int argc, char* argv[转载 2011-01-20 10:29:00 · 5269 阅读 · 0 评论 -
priority_queue用法
<br />转自:http://blog.163.com/guchonglin-6/blog/static/575275312009112204735648/<br />priority_queue 调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法<br />实现,也算是堆的另外一种形式。 <br />先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue 用法相<br />似的 priority_queue, 以加深对 p转载 2011-02-24 20:37:00 · 1278 阅读 · 0 评论 -
string大小写转换函数
<br />转自:http://blog.csdn.net/xiayang05/archive/2010/09/25/5905299.aspx<br />C++中没有string直接转换大小写的函数,需要自己实现。一般来讲,可以用stl的algorithm实现:<br />#include <iostream><br />#include <cctype><br />#include <string><br />#include <algorithm><br />using namespace std;<b转载 2011-02-28 21:38:00 · 996 阅读 · 0 评论 -
STL algorithm库
<br />Standard Template Library: Algorithms <br />The header <algorithm> defines a collection of functions especially designed to be used on ranges of elements.<br />A range is any sequence of objects that can be accessed through iterators or pointers, suc转载 2011-02-28 22:02:00 · 1528 阅读 · 0 评论 -
malloc/free与new/delete的区别
<br />相同点:都可用于申请动态内存和释放内存<br />不同点:<br />(1)操作对象有所不同。<br />malloc 与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。<br />(转载 2011-03-01 19:18:00 · 556 阅读 · 0 评论 -
scanf()使用
在学习C语言的时候,printf()是我们学到的第一个函数,相信“hello world”这个例子大家都不会陌生吧,接着就是scanf()这个函数了,这个函数的功能是格式输入,它的函数原型是: int scanf(const char *format,…); 这个函数的基本用法这里就不说了,这里介绍一些这个函数使用中常见的问题及解决方法: 第一,连续输入两个或多个字符的时候,第二次输入直接跳过了如: [code=C/C++] int main() { char a,b; scanf(转载 2011-03-03 10:38:00 · 984 阅读 · 0 评论 -
理解编译器的编译模板过程
<br />如何组织编写模板程序 <br />前言<br />常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。<br />我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(在*.h文件声明,在*.cpp文件中定义)不能用于模板转载 2011-03-03 11:20:00 · 818 阅读 · 0 评论 -
C++类模板及匹配规则
<br />(1) 类模板特化<br />有时为了需要,针对特定的类型,需要对模板进行特化,也就是特殊处理.例如,stack类模板针对bool类型,因为实际上bool类型只需要一个二进制位,就可以对其进行存储,使用一个字或者一个字节都是浪费存储空间的.<br />template <class T><br />class stack {};<br />template < ><br />class stack<bool> { //…// };<br />上述定义中template < >告诉编转载 2011-03-03 11:18:00 · 3380 阅读 · 0 评论 -
c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
<br />dynamic_cast: 通常在基类和派生类之间转换时使用,run-time cast<br />const_cast: 主要针对const和volatile的转换. <br />static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。 <br />reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。<br />1)static_cast<T*>(a)<br转载 2011-03-10 00:24:00 · 959 阅读 · 0 评论 -
散列技术
翻了一下数据结构的书,复习了散列的相关知识点,总结如下: 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)计算出对应的函数值,把这个值解释为结点的存储地址,将结点存入到此存储单元中。在一般的情况下,散列表的空间必须比结点的集合大,此时虽然浪费了一定的空间,但是换取的是检索效率。散列的好坏依赖于散列函数的设计。散列函数可能对于不相等的关键码计算出相同的散列地址即发生冲突,发生冲突的两个关键码称为该散列函数的同义词。 采用散列技术时候原创 2011-03-12 21:46:00 · 1860 阅读 · 0 评论 -
求集合的幂集
// Virtual.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include using namespace std; /* 求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己"c" ; 倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc} 倒数第三个:把自己(a)和幂积中所有元素做乘积{ab,转载 2011-03-12 11:21:00 · 1446 阅读 · 0 评论 -
memset函数详解
<br />memest原型 (please type "man memset" in your shell) <br /> void *memset(void *s, int c, size_t n); <br />memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。<br />常见的三种错误<br />第一: 搞反了c 和 n的位置. <br />一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) <br />转载 2011-03-15 11:29:00 · 778 阅读 · 0 评论 -
C++文本文件读写的方法
<br />掌握文本文件读写的方法<br />了解二进制文件的读写方法<br />C++文件流:<br />fstream // 文件流<br />ifstream // 输入文件流<br />ofstream // 输出文件流<br />//创建一个文本文件并写入信息<br />//同向屏幕上输出信息一样将信息输出至文件<br />#include<iomanip.h><br />#include<fstream.h><br />void main()<br />{<br /> ofstream转载 2011-03-13 23:04:00 · 590 阅读 · 0 评论 -
使用C++实现二叉树
复习了二叉树,顺便用C++实现了二叉树及其相关的操作,下边是源代码(部分代码可能写得不够简洁,懒得改了~)BinaryTreeNode.h,用来定义二叉树的树结点结构#ifndef BINARYTREENODE_H#define BINARYTREENODE_Htemplatestruct BinaryTreeNode{ T data; BinaryTreeNode *left,*right,*parent; //每个结点有3个指针分别指向左右子节点以及父结点};#e原创 2011-03-14 10:42:00 · 1904 阅读 · 0 评论 -
堆排序
复习了堆,用C++写了一下,代码如下:#includeusing namespace std;enum Flag{Max,Min}; //Max为最大堆,Min为最小堆templatevoid exchange(T a,T b){ *a=*a+*b; *b=*a-*b; *a=*a-*b;}//保持堆性质templatevoid keepHeap(T a[],int pos,int length,Flag原创 2011-03-14 20:36:00 · 563 阅读 · 0 评论 -
各种排序算法代码C++版
<br />之前的博文中已经实现了堆排序,因此这里就不做包含<br />Sort.h<br />template<typename T>void exchange(T a,T b){ *a=*a+*b; *b=*a-*b; *a=*a-*b;}//插入排序template<typename T>T* InsertSort(T arr[],int length){ T* tmp=new T[length]; for(int i=0;i<length;i++) tm原创 2011-03-15 16:54:00 · 1311 阅读 · 0 评论 -
cc、gcc、g++、CC的区别概括
转自:http://angela.candy.blog.163.com/blog/static/3003691820107259538779/和http://www.yuanma.org/data/2007/0406/article_2498.htmgcc是C编译器;g++是C++编译器;linux下cc一般是一个符号连接,指向gcc;gcc和g++都是GUN(组织)的编译器。而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Linux/Unix都是大小写敏感的系统,这点一定要注意。 cc是U转载 2011-05-05 01:06:00 · 3138 阅读 · 0 评论