C/C++
文章平均质量分 84
ACdreamers
这个作者很懒,什么都没留下…
展开
-
C++虚函数
今天,我来讲一种在C++编程中实现多态的机制,叫做虚函数。对于多态来说,实际上就是用父类型的指针指向子类的实例,然后通过父类的指针调用子类的成员函数,这种技术使得父类型的指针有多种形态,这是一种常见的泛型技术,除虚函数外,还有模板技术,RTTI技术也属于泛型技术。 为了清楚地理解多态,先看下面这段代码。 #include using namespace std;class原创 2015-03-03 20:28:14 · 1933 阅读 · 0 评论 -
关于C++,Java和Python中的随机数生成法
首先我们来说说C++中的随机数生成:我们知道在C++用函数rand()获取的是一个0 ~ RAND_MAX之间的一个随机数。其中RAND_MAX的值为32767。首先我们来分析两个程序:#include #include #include #include #include using namespace std;int main(){原创 2013-12-16 21:39:55 · 6297 阅读 · 0 评论 -
小数在内存中的存储表示
整数在内存中的存储方式比较简单,我们来看看小数在内存中的存储方式。首先,要学会十进制小数与二进制小数之间的转换。 (1)二进制小数转化为十进制小数 比如把二进制小数110.11转化为十进制小数,步骤如下: (2)十进制小数转化为二进制小数 方法是这样的:先分别把十进制小数的整数部分和小数部分转化为二进制,然后合并即可。当然整数部分很简原创 2014-02-09 20:03:09 · 16348 阅读 · 2 评论 -
register---C语言中最快的关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。 注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。 一、皇帝身边的小太监----寄存器不知道什么是寄存器?那见过太监没有?没有?其实我也原创 2013-12-12 13:58:13 · 1614 阅读 · 0 评论 -
不使用加减乘除符号计算加法
给定两个正整数,不使用加减乘除符号计算它们的和。方法:例如,5+17=22,5是101,17是10001。第一步各位相加得到的结果为10100(不考虑进位)---与异或操作相符;第二步记下进位,为10---可用&操作来记下;第三步把前两步的结果相加,得到10110,转换成十进制正好为22.重复上述过程,直到不产生进位为止。int add(int a,in原创 2013-11-30 19:42:45 · 2099 阅读 · 1 评论 -
sscanf()函数的用法
sscanf与scanf类似,都是用于输入的,只是后者以键盘为输入源,前者以固定字符串为输入源。 比如有些题目中有这样的输入:2012:12:20:Monday,现在要把它们提取出来分别处理,那么用sscanf()就很方便了。 #include #include #include using namespace std;char str[25];ch原创 2013-11-12 20:16:33 · 1932 阅读 · 0 评论 -
stringstream的用法
C++标准库中的提供了比ANSI C的更高级的一些功能,即单纯性、类型安全和可扩展性。 >库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。 stringstream通常是用来做数据转换的,跟C库中的sprintf()差不原创 2013-11-06 17:10:04 · 1534 阅读 · 0 评论 -
C++中的inline函数
在函数名字前面加上inline,该函数就被声明为内置函数。每当程序中出现对该函数的调用时,C++编译器使用函数体中的代码插入到调用该函数的语句之处,而不是将流程转出去,同时用实参代替形参,以便在程序运行时不再进行函数调用。 引入内置函数的目的就是:消除函数调用时系统开销,以提高运行速度。减少程序执行过程中对CPU的中断次数。 我们知道,在程序执行过程中调用函数时,系统要将程序当原创 2013-11-06 14:05:07 · 1641 阅读 · 0 评论 -
0x5f3759df的数学原理
Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。 该系列的游戏不但画面和内容不错,而且即使计算机配置低,也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代,只要能在PC上搞个小动画都能让人惊叹一番的时候,John Carmack就推出了石破天惊的Castle Wolfstein, 然后再接原创 2013-10-06 16:20:07 · 14367 阅读 · 2 评论 -
C++内存分配
在C++中内存分配方式大体可以分为3种:静态存储区分配,栈分配,堆分配。首先我们来看看这些分配有什么特点:对于静态存储区分配来说,它分配的变量在程序执行的整个时期都存在,一般static声明的变量和全局变量都在静态存储区,静态存储区变量的内存在函数编译的时候就已经分配好了。而对于栈,可以说在函数中的普通变量都是存在于栈中,当然new或者malloc的对象是存在于堆中的。栈中的变量当然有原创 2013-12-26 20:56:29 · 1355 阅读 · 0 评论 -
友元函数
C++中引入友元函数的目的是让函数或类能够访问一个类的私有数据。友元函数不是当前类的成员函数,需要在其函数名前加上关键字friend,友元函数需要声明在当前类中,而定义可以在类中,也可以在类外。我们知道一个类中的成员函数也是可以访问当前类中的所有私有数据,那么为什么不把友元函数写成类自己的成员函数呢?那么我们来举一个简单的例子。比如函数Vector multi(原创 2014-02-12 17:06:26 · 2094 阅读 · 0 评论 -
尾递归
尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去.计算n!LL fac(LL n,LL a) { return n==1? a:fac(n-1,a*n); } 对于尾递归, 他的递归过程如下:原创 2013-06-07 20:56:13 · 1442 阅读 · 0 评论 -
简单算法题
贪心法思想:你追一个MM的时候,从相识到相知,每次都采用最aggressive的方式,进攻进攻再进攻!从不采用迂回战术或是欲擒故纵之法!目标是以最快的速度确立两人关系。该法优点是代价小,速度快,但缺点是不是每次都能得到最优解。。。 顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心原创 2012-10-02 17:51:03 · 1824 阅读 · 0 评论 -
C++ STL的妙用
题目:Subsegments 题意:输入一个长度为n的整数数组,然后再输入m,然后求从第一个数开始找连续的m个数中的最大的没有重复的数,然后又从第二个数开始。。。。。。如果不存在的情况就输出Nothing比如输入为:5 31 2 2 3 3那么就有1 2 22 2 32 3 3这3种情况,它们的最大的没有重复的数字分别是1,3,2#include原创 2013-05-09 18:07:04 · 1271 阅读 · 0 评论 -
拷贝构造函数
我们知道,在C++中每一个类都有一个默认的构造函数,析构函数和拷贝构造函数。 对于两个对象p1,p2,实现语句p2 = p1就相当于在调用默认的拷贝构造函数,把p1对象的每个属性值逐个复制给对象p2的每个属性。所以拷贝构造函数主要用于对象之间的相互赋值。 当然,对于拷贝构造函数我们可以自定义,一般形式如下: class_name(const class_name &obje原创 2013-12-12 15:50:39 · 1489 阅读 · 0 评论 -
经典C++面试题
1.尔康:紫薇,一个开学的我如何拯救一个开学的你 紫薇: 尔康,我没有如期瘦得好似一道闪电,你却意外黑得像是一朵乌云。2.在我即将大二之际,我必须得向大一的你们声明,第一,你们的学姐是我们的,你们不要想;第二,我们的学 妹还是我们的,你们不要抢;第三,个别情况下,你们也是我们的,这个不要拒绝咯3. 每个月总有那么30天不想上学4.一节课40分钟,5分钟缓过原创 2012-09-05 17:20:51 · 2185 阅读 · 2 评论 -
原码,补码,反码
在计算机系统中,数值都是用补码来存储的。主要原因是:使用补码,可以将符号位和其它位统一处理,同时,减法也可以按照加法来处理,如果最高位有进位,则进位被舍弃。以一个字节为例正数的补码和反码都跟原码是相同的。对于负数则不同,负数的反码是将原码除符号位以外的各位取反,而负数的补码则是反码+1。比如:-1的原码为10000001,反码为11111110,补码为111原创 2014-02-14 19:20:10 · 1476 阅读 · 0 评论 -
关于转义字符"\r"
使用if( =='\n')遇到换行符,转换为'\0'就行了。例如:#include #include #include #include int main(){ time_t timep; char date1[30],*date2; for(;;) { timep=time(NULL); date2=strcpy(da原创 2012-06-07 13:02:31 · 5968 阅读 · 0 评论 -
C++模板机制
对于执行功能都相同的函数,只是参数类型和返回值类型不同,那么我们可以利用C++的模板机制只需要写一套代码。模板是实现代码重用机制的一种工具,可以大幅度提高程序设计的效率。模板分为函数模板和类模板。函数模板 函数模板的声明格式如下: template 返回类型 函数名(模板参数表) { 函数体 }注原创 2014-02-12 18:46:37 · 3031 阅读 · 0 评论 -
deque,list,queue,priority_queue
1.deque deque双端队列容器与vector一样,采用线性表顺序存储结构,但与vector唯一不同的是,deque采用分块的线性存储结构来存储数据,每块的大小一般为512字节,称为一个deque块,所有的deque使用一个map块进行管理,每个map数据项记录各个deque块的首地址,这样一来,deque块在头部和尾部都可以插入和删除元素,而不需要移动其它元素,在尾部插入元原创 2013-08-25 20:07:35 · 2350 阅读 · 0 评论 -
set与map容器
首先来看看set集合容器: set集合容器实现了红黑树的平衡二叉树数据结构,在插入元素时它会自动调整二叉树的排列,把该元素放到适当的位置,并且保证左右子树平衡。平衡二叉检索树采用中序遍历算法。 对于set,vector,map等等,它们的前向迭代器定义是这样的(以set为例): set::iterator it;for(it=s.begin();it!=s.end(原创 2013-08-25 19:21:33 · 7728 阅读 · 0 评论 -
缓冲区溢出
缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。 操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。 当一个超原创 2013-11-12 16:53:31 · 1945 阅读 · 0 评论 -
贪吃蛇游戏代码
#include #include #include #include const int maxn = 100;const int n = 20;struct node{ int x, y;};int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇头.node food;node原创 2012-06-03 09:01:58 · 2451 阅读 · 1 评论 -
特殊方法求1~n的和
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。 通常求1+2+…+n 除了用公式n(n+1)/2之外,原创 2013-02-05 23:07:08 · 1300 阅读 · 1 评论 -
关于int main(int argc,char *argv[])
在int main(int argc,char *argv[])中的int argc和char *argv[]都是用来在命令行里传递参数。在Linux环境下用的最多,Windows环境下一般用得较少。以一个简单的例子就能说明,比如如下代码: #include #include #include using namespace std;int main(int原创 2013-11-12 18:52:01 · 2381 阅读 · 0 评论 -
string基本字符系列容器
Code:#include #include #include using namespace std;int main(){ string s; cin>>s; s=s+"abcd"; cout<<s<<endl; s.append("123"); //在字符串s后面添加123 cout<<s<<end原创 2013-03-16 13:38:48 · 2510 阅读 · 0 评论 -
C语言/C++基础知识
1.swap()函数: swap()函数只有在头文件是#include using namespace std;时才能用,例如:#include using namespace std;int main(){ int a=23,b=45; if(a<b) swap(a,b); cout<<a<<" "<<b<<endl; return 0;原创 2012-09-05 20:01:07 · 1345 阅读 · 0 评论 -
二进制位交换,反转,与统计1的个数
问题一:给一个整数v,求它的二进制表示中从右往左数第x位和第y位交换后的值(从0开始计数)。 分析:举个例子,如果v的二进制表示为XXXXaXXXXXXbX,我们交换第1位和第8位。我们是这样做的:先把这两位的值都取零后的值保存在一个变量里面,即tmp = XXXX0XXXXXX0X,然后再取ans = 0000b000000a0,那么可以看出tmp | ans就是答案了。现在关键原创 2013-11-13 14:18:50 · 3730 阅读 · 0 评论 -
assert()函数
assert单词是断言的意思,assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行。 函数原型为void assert(int expression); 意思就是计算表达式expression,如果其值为假,那么它先向stderr打印一条出错信息,然后通过调用abort来终止程序运行。例如:int divide(int a,int b){原创 2013-11-12 17:10:00 · 1560 阅读 · 0 评论