C++
文章平均质量分 88
代丹
资深研发主管,曾就职于中兴通讯、索贝数码,现创业中。精通C++及音视频技术体系,精通Python及量化分析技术体系。持证高级项目经理,量化金融分析师。持有成都金熊猫人才卡,受政府补贴。
展开
-
老司机漫谈C++
漫谈C++的现状、窘境、价值和学习建议原创 2017-11-24 12:47:44 · 1314 阅读 · 0 评论 -
函数递归 迭代
一、栈 在说函数递归的时候,顺便说一下栈的概念。 栈是一个后进先出的压入(push)和弹出(pop)式数据结构。在程序运行时,系统每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最近进栈的对象将被弹出。然后栈指针向上移动一个位置。程序员经常利用栈这种数据结构来处理那些最适合用后进先出逻辑来描述的编程问题。这里讨论的程序中的栈原创 2014-04-28 18:01:58 · 963 阅读 · 0 评论 -
如何判断一棵二叉树是否是平衡二叉树(AVL)
问题:判断一个二叉排序树是否是平衡二叉树 这里是二叉排序树的定义 解决方案: 根据平衡二叉树的定义,如果任意节点的左右子树的深度相差不超过1,那这棵树就是平衡二叉树。 首先编写一个计算二叉树深度的函数,利用递归实现。 templatestatic int Depth(BSTreeNode* pbs){ if (pbs==NULL) return 0; else { int l原创 2014-04-28 18:01:49 · 1014 阅读 · 0 评论 -
纯虚函数和虚函数
如下声明表示一个函数为纯虚函数:class A{public: virtual void foo()=0; // =0标志一个虚函数为纯虚函数}; 一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。* 有纯虚函数的类是抽象类,不能生成对象原创 2014-04-28 18:01:37 · 863 阅读 · 0 评论 -
宏和内联
宏和内联(1)在C 程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return 等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。(2)对于C++ 而言,使用宏代码还有另一种缺点:原创 2014-04-28 18:01:30 · 820 阅读 · 0 评论 -
设计模式
书籍: 《设计模式精解》 网页: http://www.cnblogs.com/kid-li/category/44668.html原创 2014-04-28 18:00:11 · 736 阅读 · 0 评论 -
面向对象的三个基本特征
面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过原创 2014-04-28 18:02:31 · 990 阅读 · 0 评论 -
设计模式—FactoryMethod工厂模式
工厂模式要解决的是“某个对象”的创建工作,由于需求的变化,这个对象常常面临着剧烈的变化,但是这个对象拥有的接口相对稳定。也就是说:枝节常常发生变化,但是枝节与主干的接口相对稳定。 《设计模式》中是这样说明:定义一个用于创建对象的接口,让子类决定实例化那个类。FactoryMethod使得一个类的实例化延迟到子类。Factory Method的几个要点:1、Factory Met原创 2014-04-28 18:02:29 · 1016 阅读 · 0 评论 -
什么时候会用到拷贝构造函数
1-什么时候会用到拷贝构造函数? 当任何你想复印东西的时候,而不管东西被复印成什么样子。即任何你想利用一个已有的类实例给另一个类实例赋值时,这种赋值可能是显式的,也可能是隐式的显式:classa_1=class_2;隐式:函数的形参有用到类对象却没有用引用或传址技术时 函数的返回值是一个对象也没有应用传址技术时2-什么时候有必要用拷贝构造函数?上述3种情况,如果原创 2014-04-28 18:02:17 · 1458 阅读 · 0 评论 -
如何实现钩子函数
如何实现钩子函数原创 2014-04-28 18:02:15 · 1097 阅读 · 0 评论 -
线程同步
线程同步的4种方法:事件、临界区、互斥、信号量1.1 事件可以使用MFC的类 CEvent例子: CEvent threadEvent; DWord ThreadProc(LPVOID lpParam) { ::WaitForSingleObject(threadEvent.m_hOb原创 2014-04-28 18:02:22 · 796 阅读 · 0 评论 -
文件读写
FILE * fp; fp=fopen("c:\\test.txt","ab+"); fwrite(pPacket->data,pPacket->datalen,1,fp); fclose(fp);原创 2014-04-28 18:00:25 · 766 阅读 · 0 评论 -
C++编程中常见的线程和内存问题
最近在梳理一些的知识,这儿汇总一下C++中经常遇到的线程和内存问题,以便后续注意。线程问题:丢失更新、脏读、死锁等避免多线程使用线程不安全的函数避免多线程读写的数据不加锁保护避免相互调用的函数加成同一把锁造成死锁内存问题:覆盖、溢出、非法等● 使用未初始化的内存 全局变量和局部变量初始值为0,而局部变量和动态申请的变量,初始值随机。如果程序使用了随机值的变量,那么程序结果也就可能原创 2017-11-01 18:31:40 · 3667 阅读 · 0 评论 -
Window下的Caffe2编译
Windows下的caffe2编译原创 2017-11-21 19:14:45 · 4651 阅读 · 0 评论 -
数据结构算法集--C++语言实现
/**//////////////////////////// // // // 基本功能函数 BaseFun.h // // // /**//////////////////////////// void GRAPH(); void LIST(); void STACK(); void QUEUE(); void COMPOSITOR(); void BINTREE(); /*原创 2014-04-28 18:02:34 · 1002 阅读 · 0 评论 -
数据结构算法--堆栈
/**//////////////////////////// // // // 堆栈数据结构 stack.h // /**//////////////////////////// #include templateclass Stack; template class StackNode { friend class Stack; private: T原创 2014-04-28 18:02:36 · 1016 阅读 · 0 评论 -
数据结构算法--队列
/**///////////////////////////// // 队列数据结构 Queue.h // /**///////////////////////////// #include template class Queue; template class QueueNode { friend class Queue; private: Type data;原创 2014-04-28 18:02:39 · 984 阅读 · 0 评论 -
数据结构算法--链表
/**///////////////////////////// // // // 链表数据结构 list.h // // // /**/////////////////////////// #include template class list; template class listnode { public: friend class list; private:原创 2014-04-28 18:02:41 · 1039 阅读 · 0 评论 -
数据结构算法--图
/**///////////////////////////// // // // 图数据结构 graph.h // // // /**//////////////////////////// #include #include"Queue.h" templateclass Graph; template struct Node { friend class Gr原创 2014-04-28 18:02:44 · 1118 阅读 · 0 评论 -
数据结构算法--排序
/**///////////////////////////// // // // 排序算法数据结构 Compositor.h // // // /**//////////////////////////// #include template class Compositor { public: Compositor():sort(NULL)......{}原创 2014-04-28 18:02:46 · 1068 阅读 · 0 评论 -
数据结构算法--二叉树
/**///////////////////////////// // // // 二叉树数据结构 BinTree.h // // // /**//////////////////////////// #include templateclass BinTree; template class TreeNode { protected: friend clas原创 2014-04-28 18:02:49 · 1119 阅读 · 0 评论 -
5分钟了解系统架构
架构也是一种设计,但是涉及重要决策的设计才能称为架构;系统架构最重要部分就是搞清楚哪些是最重要的以及为什么;架构设计的基本思路就是分解,纵向分解业务,横向分解技术;原创 2017-11-14 12:41:40 · 27602 阅读 · 0 评论 -
C++中的指针 -- 函数指针
先说一下C式的函数指针。这种函数指针的应用十分广泛。对于任何函数 void print(string s),它的指针这样定义:void (*pfun)(string) = NULL;pfun= &print; 或者 pfun = print;两种写法没有区别。pfun是指针变量名。可以指向任何只带一个string参数,返回void的函数。这里让它指向print()函数。以后调用它的时候直接写if原创 2014-04-28 18:02:08 · 885 阅读 · 0 评论 -
C++中的指针 - 智能指针
智能指针 就是用一个C++对象来模拟指针的行为. 然后再利用这个对象的析构函数来进行指针自动删除. 当然在实现中得考虑很多细节问题.Smart Pointer是C++中的一个大题目,要说清楚他的所有好处很需要费点力气。我就一个功能一个功能的说。有我理解不透的地方希望大家指点。1.copy-to-write当生成一个C++object的时候如果这个class很大,这个object原创 2014-04-28 18:02:05 · 862 阅读 · 0 评论 -
com实现的原理
com实现的原理原创 2014-04-28 18:02:03 · 1018 阅读 · 0 评论 -
如何交换两个变量值,不能用中间变量
void swap1(int& a,int& b) { a^=b; b^=a; a^=b; } void swap2(int& a,int& b) { a=a+b; b=a-b; a=a-b; } void原创 2014-04-28 18:02:12 · 1046 阅读 · 0 评论 -
Win32应用程序中进程间通信方法分析与比较
1 进程与进程通信 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通原创 2014-04-28 18:01:54 · 864 阅读 · 0 评论 -
进程和线程的区别
进程和线程的区别 进程概念 进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表 格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所 以,进程是系统中的并发执行的单位。 在Mac、Windows NT等原创 2014-04-28 18:01:51 · 880 阅读 · 0 评论 -
多态和动态联编
同一代码可以产生不同效果的特点,被称为“多态”编译器针对虚函数产生了可以在运行时刻确定被调用函数的代码如何“动态联编” 编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?Lippman在深度探索C++对象模型[1]中的不同章节讲到了几种方式,这里把“标准的”方式简单介绍一下。 我所说的“标准”方式,也就是所谓的“V原创 2014-04-28 18:01:39 · 859 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,原创 2014-04-28 18:01:35 · 732 阅读 · 0 评论 -
static在c,c++中有什么不同点
C中常用的static ,一般用来表明 该变量 或者函数的使用域 在文件内,或者函数内。其实C++中也是一样。只不过C++中有类的静态成员一说。静态成员实际上和全局变量差不多,静态成员函数和一般的全局函数也差不多。C语言中没有类的概念,而C++中有类的概念。在C++的类定义中,可以定义一个static类型的变量,这个变量是类的一部分,它的初始化必须在类定义的外部。原创 2014-04-28 18:01:32 · 796 阅读 · 0 评论 -
N个自然数的排序算法
有N个大小不等的自然数(1--N),请将它们由小到大排序要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。void sort(int e[], int n){ int i; int t; /*临时变量:空间复杂度O(1)*/ for (i=1; i时间复杂度O(n)*/ { if(e[i]原创 2014-04-28 18:01:23 · 1500 阅读 · 0 评论 -
堆栈的实现
class CLinkStack{public: //类的缺省构造函数,生成一个空堆栈 CLinkStack () { top=NULL; }; ~ClinkStack(){};//析构函数 //定义结点结构 struct node {原创 2014-04-28 18:01:21 · 881 阅读 · 0 评论 -
回调函数
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。 回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。 为此,需要做三件事:1,声明;2,定义;3,设置触发条件原创 2014-04-28 18:00:34 · 822 阅读 · 0 评论 -
COM技术内幕
《COM技术内幕》第1章 组件 1、COM,即组件对象模型,是关于如何建立组件以及如何通过组件建构应用程序的一个规范。2、组件的优点:应用程序可随时间的流逝而发展变化;定制应用程序;组件库;分布式组件。3、对组件的需求:组件必须动态连接;必须隐藏其内部实现细节。4、COM组件是以Win32动态链接库(DLLs)或可执行文件(EXEs)的形式发布的可执行代码组成的。遵循COM原创 2014-04-28 17:59:50 · 1056 阅读 · 0 评论 -
strcpy ,memcpy,memset比较
strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。memcpy 原型:extern void *memcpy(v原创 2014-04-28 18:01:18 · 851 阅读 · 0 评论 -
计算主机网络地址和广播地址
? 这是一个CCNA论证中的实例。一个主机的IP地址是202.112.14.137,掩码是255.255.255.224,要求计算这个主机所在网络的网络地址和广播地址。 【分析】常规办法是把这个主机地址和子网掩码都换算成二进制数,两者进行逻辑与运算后即可得到网络地址。其实可以采取本章前面介绍的简便方法进行。 255.255.255.224的掩原创 2014-04-28 18:01:28 · 1833 阅读 · 1 评论 -
c++如何使用c中的函数,为什么?
extern 'C' 注意 “C”必须大写指出了代码是用c编译器编译过的,保留了c中的特性因为C++与C中的函数签名以及函数调用方式是不一样的 C compiler和C++ compiler将.c/.cpp编译成.obj时候给一个方法命名时候所采 用的方案是不同的,C compiler比较简单,加一个下滑线"_",比如 foo()原创 2014-04-28 18:01:47 · 804 阅读 · 0 评论 -
为什么要自己写构造函数和析构函数
为什么要自己写构造函数和析构函数“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。 类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用St原创 2014-04-28 18:01:25 · 2608 阅读 · 0 评论 -
设计模式—Singleton单件模式
单件模式的使用意图就是:保证一个类仅有一个实例,并提供一个该实例全局的访问点(这句话当然不是我先说的,是引用Gof在《设计模式》中的一句话)单件模式本质就是控制对象的构建,如果你把对象构建的方法给了类的使用者,你就无法控制类对象的构建个数,要控制类对象的构建个数,就要自己掌握类的构建方法,类的构建方法不被其他类使用者使用,所以,类的构建方法私有化可以达到限制的目的。单件模式的实现:在单线程的情况下原创 2014-04-28 18:02:26 · 876 阅读 · 0 评论