C/C++基础
文章平均质量分 75
疯狂-的-蜗牛
https://github.com/JelinYao
展开
-
C++实现贪吃蛇类
希望对C++初学者了解OOP有一定的帮助,本人也是菜鸟欢迎批评指教。废话少说,上代码:#ifndef SNAKE_H_#define SNAKE_H_#include #include #include "windows.h"#include using namespace std;typedef struct{ int xPos; int yPos原创 2012-02-25 11:31:52 · 3455 阅读 · 2 评论 -
C语言“指针函数”与“函数指针”的区别
原文转载自:http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html,感谢作者。1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个转载 2015-03-09 14:32:14 · 707 阅读 · 0 评论 -
STL中map容器使用自定义key类型报错详解
引言STL的map容器中,key的类型是不是随意的呢?实践编写测试代码定义一个结构体来试试:struct a{ char* pName; int m_a; };map mp; a a1; a1.m_a = 100; a1.pName = "a1"; a a2; a2.m_a = 200; a2.pName = "a2"; mp.insert(std:原创 2015-03-09 17:37:48 · 14315 阅读 · 1 评论 -
C语言文件操作函数大全
fopen(打开文件)相关函数 open,fclose表头文件 #include定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。mode有下列几种形态字符串:r 打开只读文件,该文件必须存在。r+ 打开可读写的文件,该转载 2015-05-14 22:08:12 · 592 阅读 · 0 评论 -
windows下编译及使用libevent
原文出自:http://www.cnblogs.com/luxiaoxun/p/3603399.htmlLibevent官网:http://libevent.org/windows 7下编译:编译环境: windows 7 + VS2010(1)解压libevent到F:\libevent\libevent-2.0.21-stable(2)打开Micro转载 2015-10-18 17:55:09 · 5383 阅读 · 0 评论 -
C++模板元编程之模板递归
如何提高程序运行效率?在编译时就把需要计算的结果算出来,避免运行时占用CPU时间去做耗时计算,这就是模板递归的原理。举例说明:1、计算100的阶乘//一般情况下,我们是这样做的:int GetFactorial(const int n){ int nResult=1;//n=0或者1时返回1 assert(n>=0); if(1!=n) nResult=GetFa原创 2013-04-18 17:17:33 · 6876 阅读 · 0 评论 -
c++内存分配方式,堆栈区别,堆栈段,数据段,代码段,附加段
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。转载 2014-06-19 11:08:13 · 2818 阅读 · 0 评论 -
vector内存机制和性能分析
一些好的公司校园招聘过程中(包括笔试、面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析。今天看了下相关文章,也写了几个小的测试程序跑了跑。算是总结下,希望对需要的人有帮助。关于vector,简单地讲就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时会自动申请另一片更大的空间,然后把原有数据拷贝过去,接着释放原来的那片空间;当释放或原创 2013-04-01 17:14:26 · 32953 阅读 · 11 评论 -
c++中char*\wchar_t*\string\wstring之间的相互转换
string U2A(const wstring& str)//Unicode字符转Ascii字符{ string strDes; if ( str.empty() ) goto __end; int nLen=::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULL, NULL); if ( 0==原创 2012-05-02 23:16:29 · 18397 阅读 · 3 评论 -
C++多字节与宽字节间的转换(wchar_t与char转换)
详细代码及说明已更新至C++多字节与宽字节间的转换(wchar_t与char转换)原创 2012-04-13 18:07:12 · 11110 阅读 · 0 评论 -
分享个C++日志记录类以及日志记录程序
前言个人觉得开发中比较重要的一点就是“不要重复发明轮子”,现在国外、国内开源软件遍地开花,尤其是Google,开源了一系列性能、架构特别好的代码,如果能够用开源的应该尽量避免自己造轮子。那么为什么不用log4plus呢?在这里我需要的是一个简单实用、轻巧的日志记录程序,log4plus对我有点臃肿,所以才自己花店时间写了一个简单的日志记录类。日志类实现刚开始想的是为了避免大量的读写程序原创 2015-12-01 21:48:12 · 15667 阅读 · 0 评论 -
C++实现软件版本号管理类
最近做了个更新程序,更新下配置文件后通过对比版本号大小来确定是否有更新。原来仅仅只是简单的比较字符串的大小,用_tcscmp来做的,但是在形如:2.2.12.6和2.2.9.6对比时,明显会不对。于是就用C++写了一二个简单的版本号转化、对比的类。代码如下:#pragma once#include using std::wstring;class CVersion{publi原创 2014-12-18 12:26:40 · 4016 阅读 · 0 评论 -
libjpeg-turbo使用实例(编解码jpeg、jpg转bmp、bmp转jpg代码)
libjpeg-turbo库用于jpeg图像编解码,上一节说了编译过程:编译libjpeg-turbo 。现在说说jpeg的编码、解码使用方法。Windows上GDI接口支持的都是位图格式(DDB\DIB)图像,这里只说bmp编码成jpeg格式图片并保存到本地和jpeg解码成bmp格式并保存到本地。bmp转jpegint Bmp2Jpeg_Compress(void* lpBmpBuf原创 2016-09-23 22:12:05 · 17071 阅读 · 2 评论 -
realloc,malloc,calloc的区别
转载自:http://www.cnblogs.com/BlueTzar/articles/1136549.html,感谢作者。三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t size转载 2016-10-18 21:12:50 · 566 阅读 · 0 评论 -
Windows上获取文件大小的几种方法及获取文件夹大小方法
获取文件大小Windows提供了好几个API函数来获取文件大小,还可以使用标准C和标准C++库函数来获取(当然了,标准库函数的底层实现也是调用了Windows API函数,效率上可能有所影响)。const wchar_t* pFile = L"C:\\chromium.tar";//文件大小9,332,330,496 字节 32位整形无法装下 HANDLE hFile = CreateF原创 2016-11-17 22:12:03 · 15571 阅读 · 2 评论 -
C++模版编程——单链表的实现
代码的注释还是很清晰的,就不说废话了。直接上代码:#pragma once#include #include using std::cout;using std::endl;//单链表模板类templateclass CList{public: //类方法接口 enum{begin=0,end=-1}; typedef struct _LIST { _LI原创 2012-06-04 17:42:27 · 6714 阅读 · 2 评论 -
C++中四种类型转换方式
原文转载自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/23/2652696.html,感谢原作者。类型转换有c风格的,当然还有c++风格的。c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向转载 2015-03-03 21:11:15 · 808 阅读 · 0 评论 -
LocalAlloc,VirtualAlloc,malloc,new的异同
原文转载自:http://www.cnblogs.com/Clingingboy/archive/2013/03/07/2947934.html,感谢原作者。首先明白几个概念:虚拟内存是从硬盘置换出来的,堆本身就是内存,程序运行时,可用内存=物理内存+虚拟内存。虚拟内存一般用文件来保存数据,虚拟内存的出现主要是因为以前内存不够(16M的内存刚出来的时候可是天价啊),磁盘相对便宜一些,所以聪明的转载 2015-03-15 22:03:08 · 703 阅读 · 0 评论 -
C++实现:分数类
花了几个小时敲代码——测试——修改……总算搞定了好累,睡觉去的有问题欢迎提出,继续修改首先是头文件CFraction.h: #ifndef CFRACTION_H_#define CFRACTION_H_#include using namespace std;class CFraction{public: CFraction(int a=1,原创 2012-03-05 22:20:15 · 7839 阅读 · 3 评论 -
C++实现:BF算法和KMP算法
BF算法:int BF_Find(string& s,string& t){ int i=0,j=0,count=0; while(i<s.size()) { if(s.at(i)==t.at(j)) { i++; j++; count++;} else { i++; j=0; co转载 2012-03-07 21:38:51 · 9529 阅读 · 1 评论 -
C++构造函数之深度复制(deep copy)
C++字符串作为类成员时,直接的复制很可能导致两个指针指向同一内存区域,析构时将引发未知错误本文介绍下处理方法:#ifndef INHERITANCE_H_#define INHERITANCE_H_#include using namespace std;class Father{ public: Father(char* str="NoName");原创 2012-03-23 23:56:32 · 8049 阅读 · 0 评论 -
C++文件操作
1、头文件介绍#include //标准输入输出流#include //派生自iostream,包括ifstream和ofstreamusing namespace std;//都在名称空间std中,别忘了加上2、打开文件const char* fileName="1.txt";//要打开的文件名,可以使路径名,默认情况下是所建工程下fstream类派生了两个类ifstre原创 2012-03-08 13:42:55 · 23914 阅读 · 0 评论 -
C++模板实现智能数组类
这个类的使用非常有限,不能说是真正的智能数组对于一般的数据类型还可以,比如int /float/char等但是,string类这样的类类型好像不是很好但是一些基础的东西却是学习的重点头文件MyArray.h:#pragma once#include using namespace std;template//定义一个类似数组的模板类(智能数组)class CMy原创 2012-03-27 22:39:21 · 3941 阅读 · 1 评论 -
C++基础——抽象基类(ABC)
抽象基类(ABC)即Abstract Base Class利用了基类指针指向派生类对象从而调用派生类方法的思想实现C++的隐藏具体实现则主要用到的是纯虚函数#pragma once#include "stdafx.h"#include #include using std::cout;using std::endl;class AbstractClass//抽象基类//原创 2012-04-06 08:34:23 · 3462 阅读 · 0 评论 -
C++基础——多继承问题
本文主要介绍C++的多继承问题,包括基类和派生类的 构造函数、析构函数调用顺序,基类父类虚函数的调用……详情请见代码注释书本上讲得再多,还不如自己动手测试:头文件:class.h: #ifndef CLASS_H_#define CLASS_H_#include #include using namespace std;class s1{public原创 2012-03-20 13:12:22 · 863 阅读 · 0 评论 -
C++基础——操作符重载
关于操作符重载,是C++一个十分强大的功能。本文初略介绍下,涉及到友元以及函数重载头文件MyClass.h:#ifndef MYCLASS_H_#define MYCLASS_H_#include #include using namespace std;class MyClass{ friend ostream& operator<<(ostream& o原创 2012-03-21 22:49:03 · 807 阅读 · 0 评论 -
C++读取歌词文件(LRC),分解时间和歌词的方法
歌词文件的编码问题尤其须要注意!主要用到两个函数,如下:typedef struct _LYRIC{ long time; string strText;}LYRIC,*LPLYRIC;// 读取歌词文件BOOL CLyricsDlg::ReadLyricsFile(){ m_bFileExist=TRUE; ly.clear(); BOOL unicode=FA原创 2012-05-27 00:04:58 · 4333 阅读 · 2 评论 -
C++实现:霍夫曼编码
#ifndef CHUFFMANTREE_H_#define CHUFFMANTREE_H_#include #include #include #include using namespace std;/***************************************************************************//*先谈谈霍夫曼编码的基本原创 2012-05-21 21:58:08 · 5619 阅读 · 0 评论 -
使用开源库zlib压缩和解压文件
zlib,一个十分强大的开源压缩解压库,应用示范广泛,很多开源库中都有它的存在(libpng,libzplay,ffmpeg……)。作为普通开发者只要掌握其主要的两个函数就足够用了:int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);compress函数将 source 缓冲区原创 2012-09-26 17:18:55 · 27784 阅读 · 4 评论 -
C++实现一个简单的异常日志记录类
头文件#pragma once///////////////////////////////////////////////////////////////////////////////////异常信息记录类#include #ifdef UNICODE#define tstring std::wstring#else#define tstring std::st原创 2013-03-03 22:12:33 · 4172 阅读 · 2 评论 -
两道C语言面试题
1、如果已知一个数的阶乘的结果不大于10的4次方,则可以设置一个矩阵b[4]存放每个位。例如,5!=120,则,b[0]=0,b[1]=2,b[2]=1,b[3]=0。给出一个求阶乘的方法:如果已知K的阶乘,求K+1的阶乘时,可用矩阵b的每一位去乘以(k+1),如果结果大于9,就进位到前一位,直到所有的位都小于等于9问:(1)、如果是b[100],写出完整的求阶乘的程序(2)、原创 2013-03-17 16:17:08 · 1407 阅读 · 0 评论 -
C++实现一个简洁而又强大的日志记录类
代码执行时记录日志是很有必要的,尤其在涉及到多进程、多线程调试或者是调试服务程序时。本分分享一个最近写的简单的日志类,希望有所帮助。不喜欢废话,上代码了:头文件如下:#pragma once#include <string>using std::string;using std::wstring;class CSimpleLog{public: CSimple...原创 2014-12-18 15:46:01 · 16482 阅读 · 8 评论 -
C++模板编程实现二维数组
数组在C语言里面经常使用,有一个缺陷就是必须在定义的时候就指定大小,一旦申请后这片区域就不能动态的扩展。但是很多情况下我们并不知道大小是多少,于是就需要动态分配内存来存储。这里仅仅是一个小例,希望可以起到抛砖引玉的作用。为什么使用模板?使用模板的通用性很强,数组可能是int类型,也可能是bool类型……,使用模板就避免了为每一种类型去量身定制一套相同的功能。我想,这也是C++模板的初衷吧。原创 2014-12-18 12:04:46 · 3673 阅读 · 0 评论 -
设计模式之观察者模式的C++实现
当一个对象改变时需要同时通知其他多个对象,或者说一个对象依赖另一个对象的时候,使用观察者模式可以将这两者封装在独立的对象中使他们各自独立地改变和复用。观察者模式所做的工作就是在接触耦合,让相互耦合的双方都依赖于抽象而不是具体类,从而使得各自的改变都不会影响到对方。(引用自 《大话设计模式》)下面提供一个观察者模式的C++实现版本:#pragma once#include #incl原创 2015-01-19 12:34:48 · 951 阅读 · 0 评论 -
C++实现常用排序算法(快速排序、冒泡排序、希尔排序、折半插入排序、直接插入排序)
#ifndef SORT_ALGORITHM_H_#define SORT_ALGORITHM_H_#include #include using std::cout;using std::endl;template//T为排序序列元素类型,len为序列元素数目class CSort{public: CSort(const T* arr); virtual~ CSort()原创 2016-12-18 22:01:43 · 2405 阅读 · 1 评论