随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万
11 2013 档案
遍历结果推导二叉树
摘要:1、根据前序与中序,推导二叉树。举例来说:前序ABC,中序CAB,由前序直到A为根节点,由中序知道A的左边为左孩子,右边为右孩子。C为左孩子,B为右孩子。2、思考,由前序和后续,能否退出二叉树? 前序ABC,后序CBA。由前序ABC知道A为根节点,后面分成两块,每一块都是前序,前面一块为左孩子,后面一块为右孩子。由后序知道A为根节点,前面分成两块,每一块都是后序,前面一块为左孩子,后面一块为右孩子。都是分成两块,对于分成的两块,前面一块元素集合相同,后面一块元素集合相同。注意,集合不考虑元素的顺序。这样,就有两种情况: a、前面一块为BC,后面一块为空 b、前面一块为空,后面一块为BC ... 阅读全文
posted @ 2013-11-29 19:07 Andy Niu 阅读(1778) 评论(0) 推荐(0) 编辑
二叉树非递归遍历
摘要:1、二叉树递归遍历很简单,以前序遍历为例说明:1 void PrefixOrder(Node* node) 2 {3 if(node!=NULL)4 {5 coutvaluelchild);7 PrefixOrder(root->rchild);8 }9 } 中序遍历和后序遍历类似。2、考虑二叉树非递归遍历,思路:前序遍历特点,访问当前节点,然后访问左孩子,左孩子有孩子,继续访问左孩子的左孩子节点,直到没有左孩子,访问右孩子。因此。非递归遍历的思路就是,使用while,记录当前节点,往左一条路走到底,然后原路后退,访问右节点。 阅读全文
posted @ 2013-11-29 18:41 Andy Niu 阅读(214) 评论(0) 推荐(0) 编辑
左闭合区间
摘要:1、什么是左闭合区间? [first,last),就是包含first,但是不包含last的区间范围。2、为什么使用左闭合区间? 使用左闭合区间有两个方便的性质: a、first == last,说明没有区间元素 b、first!=last,说明区间至少有一个元素,而且多次first++,最终可以到达last c、查找target,返回的位置==last,说明在范围内没有找到target 编程中使用左闭合区间,更重要的是,提供了一致性。我们知道对于数组,和基于连续内存的集合,假如元素个数为5,可访问的范围是[0,5),注意下标5并不是有效元素。 阅读全文
posted @ 2013-11-29 17:01 Andy Niu 阅读(1138) 评论(0) 推荐(0) 编辑
理解 __declspec(dllexport)和__declspec(dllimport)
摘要:1、解决的问题: 考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。二者使用同一个头文件,作为接口,怎么办呢?2、解决办法: 使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值。 1 #ifndef DLL_H_ 2 #define DLL_H_ 3 4 #ifdef DLLProvider 5 #define DLL_EXPORT_IMPORT __declspec(dllexpo... 阅读全文
posted @ 2013-11-28 20:15 Andy Niu 阅读(32140) 评论(2) 推荐(1) 编辑
方法的确定
摘要:1、方法有三个部分:方法的拥有者,方法名,方法形参表。2、对象有表面类型和真实类型,编译器编译的时候,仅仅知道对象的表面类型,而不知道对象的真实类型。3、调用方法的时候,有很多同名方法,到底调用那个方法呢?4、依据是: a、如果是virtual方法,根据方法拥有者的真实类型,决定调用哪个方法。 b、根据形参表的表面类型,决定调用哪个方法。 阅读全文
posted @ 2013-11-28 19:44 Andy Niu 阅读(332) 评论(0) 推荐(0) 编辑
C++,C#,Python
摘要:1、C++的思路:无论是基本类型,还是类类型,对象的传递提供了两种方式,一个是整体拷贝,一个是复制引用。整体拷贝对应着copy构造和copy赋值,复制引用就是通过引用或者指针实现的,当然指针本身还是整体拷贝,也可以是引用。 C++对象既可以分配在栈上,也可以分配在堆上,分配在堆上的对象必须手工delete2、C# 的思路:类类型整体拷贝,代价大,基本类型代价小。基本类型是整体拷贝,类类型是复制引用。C#中的引用是对C++引用的强化,和C++指针的弱化。 C++中引用必须是一个对象的别名,而且必须至始至终是这个对象的别名。 C++指针可以修改指向对象的内容,可以修改指针的指向,也可以对指针... 阅读全文
posted @ 2013-11-28 19:35 Andy Niu 阅读(616) 评论(0) 推荐(0) 编辑
vector 与map的下标操作
摘要:1、vector的下标操作不会添加元素,只能针对已经存在的元素操作。2、map的下标操作具有副作用,key不存在,会在map中添加一个具有该key的新元素,新元素的value使用默认构造方法。3、为什么要这样设计? vector是基于连续内存的容器,在尾部操作效率高,使用push_back添加元素,使用下标必须保证下表存在元素。 map是基于节点的容器,元素有序。使用下标操作,第一步是查找key是否存在,map的内部实现是二叉树(AVL树或者红黑树),采用二分查找。不管是否存在key,查找key 的时候,也已经确定了key的位置。因此,如果不存在key,干脆添加一个,反正已经知道添加位置,.. 阅读全文
posted @ 2013-11-26 18:57 Andy Niu 阅读(3841) 评论(0) 推荐(0) 编辑
C# is与as
摘要:1、使用场景: 强制类型转换,有可能会导致异常。is与as就是为了解决这一问题,is与as永远不会抛出异常。2、is判断一个对象是否兼容于指定的类型,考虑里氏代换。Dog是Animal,而Animal不是Dog。3、as 与强制类型转换一样,区别是使用as是安全的。使用as如果转换失败,返回Null,不会抛出异常。4、使用is和as可以取代强制类型转换,分别如下: 1 a、使用is 2 if(a is Dog) 3 { 4 Dog d = (Dog)a; 5 ... 6 } 7 8 b、使用as 9 Dog d = a as Dog;10 if(d!... 阅读全文
posted @ 2013-11-26 18:34 Andy Niu 阅读(3600) 评论(0) 推荐(0) 编辑
Python 删除目录中特定文件
摘要:代码如下,使用了递归: 1 import sys 2 currDir = sys.path[0] 3 4 import os 5 def removeFile(dir,postfix): 6 if os.path.isdir(dir): 7 for file in os.listdir(dir): 8 removeFile(dir+'/'+file,postfix) 9 else:10 if os.path.splitext(dir)[1] == postfix:11 os.remove(dir)... 阅读全文
posted @ 2013-11-26 17:54 Andy Niu 阅读(6610) 评论(2) 推荐(1) 编辑
静态成员与实例成员
摘要:1、类的成员分为静态成员和实例成员。为什么设计出静态成员和实例成员? 静态成员对类以及类的所有实例有意义,实例成员对每个实例有意义。考虑,Person类,有个age字段和maxAge字段。每个Person实例都有自己的age,但所有的Person实例都有相同的maxAge(最大年龄极限),因此,maxAge只需要一份就好了,大家共享。有两个好处:节约内存和保持一致。2、成员分为字段和方法,首先考虑字段: 静态字段:只有一块内存。 实例字段:每个实例都有专属于自己的一块内存。3、对于方法: 无论静态方法和实例方法,只有一块内存。那么问题来了,在成员方法中会使用实例的字段,怎么区分是哪个实... 阅读全文
posted @ 2013-11-25 20:08 Andy Niu 阅读(2428) 评论(0) 推荐(0) 编辑
const 成员方法
摘要:1、使用场景 代码提供者告诉客户(代码使用者),这个方法不会修改对象的内容,请客户放心使用。2、代码提供者,尝试在const成员方法中修改对象内容,编译报错。在成员方法中,this是const 指针,不允许修改this指向其他内容。const 成员方法,限制了this为指向const对象的const指针。3、const对象只能调用const成员方法,因为non-const成员方法可能会修改对象内容,这与const对象矛盾。4、non-const对象可调用const成员方法,也可以调用non-const成员方法。5、为什么可以做到上面的约束? 如果B是A的别名(包括引用,指针),则B不能放大.. 阅读全文
posted @ 2013-11-25 19:33 Andy Niu 阅读(227) 评论(0) 推荐(0) 编辑
C++ 预编译头文件
摘要:1、解决什么问题? C++ 编译器是单独,分别编译的,每个cpp文件,进行预编译(也就是对#include,define 等进行文本替换),生成编译单元。编译单元是一个自包含文件,C++编译器对编译单元进行编译。考虑,头文件A.h被多个cpp文件(比如A1.cpp,A2.cpp)包含,每个cpp文件都要进行单独编译,其中的A.h部分就会被多次重复第编译,影响效率。2、怎么解决? 把A.h以及类似A.h这样的头文件,包含到stdafx.h中(当然也可以是其他文件),在stdafx.cpp中包含stdafx.h,设置stdafx.cpp文件的属性,预编译头设置为 创建。对于原先包含A.h的cp.. 阅读全文
posted @ 2013-11-22 16:42 Andy Niu 阅读(12452) 评论(0) 推荐(1) 编辑
C++ 对象没有显式初始化
摘要:C++ 对象没有显式初始化,结果是什么?首先考虑非静态对象1、方法内的局部对象: a、类类型:调用default构造方法 b、基本类型:值不确定2、类中的数据成员: a、类类型:调用default构造方法 b、基本类型:值不确定注意:Person p; 调用default构造方法,不能使用 Person p(),对于Person p(),编译器会认为声明一个方法。当然也可以使用 Person p = Person();考虑静态对象:1、方法内的局部对象: a、类类型:调用default构造方法,注意:类对象中的基本类型对象,即使没有显式初始化,也会初始化为0 b、基本类型:02、类... 阅读全文
posted @ 2013-11-22 14:13 Andy Niu 阅读(778) 评论(0) 推荐(1) 编辑
NFA与DFA
摘要:正则表达式匹配,包含两个东西,一个是表达式,一个文本。NFA(Nondeterministic Finite Automaton),不确定有穷自动机,表达式主导,NFA去吃文本,贪婪算法吃下去,如果因为前面吃得太多,导致后面没的吃(后面匹配失败),前面吃的要吐出一点,后面还匹配不成功,前面再吐出一点... 阅读全文
posted @ 2013-11-21 19:36 Andy Niu 阅读(501) 评论(0) 推荐(0) 编辑
VS DLL 复制本地
摘要:1、引用一个DLL,需要指定路径,复制本地的意思是 把这个DLL复制到exe的Debug目录(调试的时候)。2、复制到本地的动作是在生成的时候执行的,清理的时候会删除。3、从外部引用一个DLL,不复制到本地,生成没问题,运行会报错,因为,Debug目录没有DLL。4、每次清理会删除Debug目录的DLL,重新生成会再次复制到Debug目录,为了避免这种情况,可以:把DLL放到Debug目录,直接引用Debug目录下的DLL,同时复制本地设为false5、如果引用一个工程,复制本地必须要设置为true,只有这样,修改工程导致的结果才能体现出来。同时,引用一个工程,这个工程会把自己所需要的DLL, 阅读全文
posted @ 2013-11-21 18:23 Andy Niu 阅读(7090) 评论(0) 推荐(0) 编辑
TFS 图标意思
摘要:小人:文件被其他人签出对号:文件被自己签出锁:文件已经被签入加号:新增加一个文件 阅读全文
posted @ 2013-11-21 18:13 Andy Niu 阅读(897) 评论(0) 推荐(0) 编辑
C++ 析构方法
摘要:1、什么是析构方法? 析构方法与构造方法互补。2、为什么设计析构方法? 构造方法创建一个对象,对象内部往往还会申请一些资源。设计析构方法的目的是 释放资源,同时销毁自身。3、析构方法可以认为分为两个:显式析构方法和合成析构方法。 显式析构方法用于:释放对象申请的资源,也就是指针指向的对象。 合成析构方法用于:销毁自身,对于对象的每一个数据成员(不包括继承的数据成员),进行析构。继承的数据成员通过父类的合成析构方法进行析构。4、即使编写了显示析构方法,合成析构方法仍然会运行。首先使用显式析构方法释放资源,再调用合成析构方法销毁自身。5、如果对象没有申请资源,显式析构方法不需要做任何事,也... 阅读全文
posted @ 2013-11-21 17:46 Andy Niu 阅读(2787) 评论(0) 推荐(0) 编辑
C++ 异常
摘要:1、什么是异常? 异常就是程序出现了错误。2、为什么设计异常? 库(任何代码)的提供者检测出运行时出现的错误,但是不知道怎么处理。而库的使用者(客户)知道怎么处理这些错误,但是不知道何时发生(如果很明确知道何时发生,就可以在客户端处理了,不再留给库)。简单说,设计异常的目的就是:问题检测与问题处理相分离。3、使用错误码也可以表示错误,但是不好。为什么? a、缺乏语义; b、可以被忽略,异常不能被忽略,抛出异常不处理,会导致程序终止; c、缺乏调用堆栈的上下文; d、错误码必须一级一级传回去,异常可以跳级。4、catch是最先匹配,而不是最优匹配。因此,范围小的异常(具体的异常)放在... 阅读全文
posted @ 2013-11-19 10:11 Andy Niu 阅读(394) 评论(0) 推荐(0) 编辑
【转】二叉树的非递归遍历
摘要:原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现void 阅读全文
posted @ 2013-11-15 17:49 Andy Niu 阅读(193) 评论(0) 推荐(0) 编辑
【转】Dijkstra算法(单源最短路径)
摘要:原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。 假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j 阅读全文
posted @ 2013-11-15 17:43 Andy Niu 阅读(655) 评论(0) 推荐(0) 编辑
Dijkstra最短路径算法
摘要:1、现讲最优子结构性质,所谓的最有子结构性质是指:一个问题的最优解包含子问题的最优解。最短路径满足最优子结构。MinPath(i,j)表示i与j之间的最短路径。假如MinPath(i,j)={Vi...Vk...Vs...Vj},则MinPath(k,s)={Vk...Vs}。反证法很容易证明:如果MinPath(k,s)≠{Vk...Vs},说明存在一个更短的路径,那么{Vi...Vk...Vs...Vj}也不是最短路径,这与已知条件矛盾。2、思路:Dijkstra最短路径算法满足最优子结构性质,因此每个点只需要知道自己的前驱节点,逆序排一下,就知道了路上的节点。同时,还要记录最短距离。 . 阅读全文
posted @ 2013-11-15 17:41 Andy Niu 阅读(536) 评论(0) 推荐(0) 编辑
python __name__
摘要:1、解决的问题: 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法。因此,对每个py文件,可以单独运行,也可以import它给其他客户使用,这两种情况不一样,因为客户import一个py文件,并不想运行它。如何区分这两种情况呢?2、如何解决: __name__属性,当运行py文件时,它的值是__main__,当import的时候,它的值是文件名。这样在py文件中,就能区分当前文件是被运行还是被import,不同的情况,执行不同的代码。 阅读全文
posted @ 2013-11-15 16:14 Andy Niu 阅读(1645) 评论(0) 推荐(0) 编辑
插入排序
摘要:1、思路:假定前面的序列已经有序,当前元素插入前面有序的序列。从后往前遍历,比当前元素大的,往后移,为当前元素腾出位置。2、代码: 1 template 2 void InsertSort(vector& vec) 3 { 4 for(int i=1; i0 && target 2 int FindPosition(const vector& vec,int lhs,int rhs,T target) 3 { 4 if(rhs-lhs ==1) 5 { 6 if(target>vec[lhs]) 7 { 8 re... 阅读全文
posted @ 2013-11-14 19:32 Andy Niu 阅读(280) 评论(0) 推荐(0) 编辑
选择排序
摘要:1、思路:对于当前第一个数,假定它是最小的,遍历后面的数,发现比当前数还小的,进行交换,这样就保证了当前第一个为最小的。2、代码: 1 template 2 void SelectSort(vector& vec) 3 { 4 for(int i=0; i 2 void SelectSort_2(vector& vec) 3 { 4 for(int i=0; i< vec.size();i++) 5 { 6 int index_Min = i; 7 for(int j=i+1;j < vec.size();j++) 8 ... 阅读全文
posted @ 2013-11-14 19:27 Andy Niu 阅读(273) 评论(0) 推荐(0) 编辑
冒泡排序
摘要:1、思路:内层循环,比较当前元素与相邻的下一个元素,顺序不对,进行交换,这样就把最大的数沉到底部。外层循环,对于每次剩余的数,把最大的沉到底部。2、源码: 1 template 2 void BubbleSort(vector& vec) 3 { 4 for(int i=0; ivec[j+1]) 9 {10 swap(vec,j,j+1);11 }12 }13 }14 } 阅读全文
posted @ 2013-11-14 19:19 Andy Niu 阅读(229) 评论(0) 推荐(0) 编辑
Python 动态语言
摘要:1、在C++中,Animal a = Person(); 这样写是不行的,因为a的内容不能使用Person的内容来填充。2、在Python中,变量不需要声明,而且可以赋任何值。Python是如何做到的? Python的设计理念是:变量和实体分离,变量可以认为是一个指针,指向某个实体,而且可以指向任何实体。这个变量只能指向实体,不能包含实体的内容。对变量赋值,不是修改指向的实体,而是使变量指向另一个实体。 也就是说,变量没有办法修改指向的实体,修改变量只不过是让他指向另一个实体。 变量可以间接的修改实体,比如a,b指向同一个容器,a修改容器的第一个元素,b容器的第一个元素也发生变化。但这本... 阅读全文
posted @ 2013-11-14 17:13 Andy Niu 阅读(784) 评论(0) 推荐(0) 编辑
关于软件的说法
摘要:1、如果手里有一把锤子,看啥都像钉子。2、KISS :Keep It Simple Stupid3、DRY:Donot Repeat Yourself4、Make Clean Code Fast 比 Make Fast Code Clean重要,并且简单。5、避免垃圾进,垃圾出。正确的做法是:垃圾不让进,或者垃圾进给出错误提示。6、简单就是美,奥卡姆剃刀原理,没有必要,勿增实体。7、好的代码尽量做到自说明的,不需要太多的注释。8、一切软件的本质是增删改查,和数据可视化。这里的数据是结构化的数据,不同的结构把无差别的字节组织称千差万别的对象,千差万别的对象相互协作构成系统。 阅读全文
posted @ 2013-11-14 14:11 Andy Niu 阅读(233) 评论(0) 推荐(1) 编辑
隐式类型转换 与 隐式类型转换操作符
摘要:1、考虑下面的情况:有个Person类,内部有个age字段。正常情况下,定义和赋值为:Person p = Person(8);p = Person(9);但是有个家伙很懒,他想这么写:Person p = 8;p =9;这样写也是可以的,因为编译器知道你的意图,运行的时候会进行一次隐式类型转换,中间适配一个临时对象。这就是隐式类型转换,但这样写不好,因为语义不通。要避免这种情况,使用explicit,这样编译器就会曝出错误。2、现在在考虑下面的需求:判断p的年龄是否大于5,正常的写法是:if(p.GetAge()>5){....}但是,上面的家伙还是很懒,想直接这样写:if(p> 阅读全文
posted @ 2013-11-14 14:10 Andy Niu 阅读(845) 评论(0) 推荐(0) 编辑
C++ 临时对象
摘要:1、什么是临时对象? swap方法中,常常定义一个temp对象,这个temp对象不是临时对象,而是局部对象。这里所说的临时对象是不可见的,在原代码中是看不到的。2、为什么会产生临时对象? a、客户期望的数据与你提供的数据不一致,需要隐式类型转换,中间需要适配一下,建立一个临时对象。 b、方法返回值,他是没有名字的,起到一个传递作用,方法内部的局部对象-->方法返回值-->主调方法中的接受对象。 c、异常处理,分为两个过程:抛出异常,捕获异常。抛出异常相当于return 方法内的局部对象,外部要有一个匿名的临时对象接收。catch语句类似于调用方法,将临时对象传给catch语句。3、 阅读全文
posted @ 2013-11-13 17:38 Andy Niu 阅读(2698) 评论(0) 推荐(0) 编辑
【转】C++ static关键字
摘要:原文:http://blog.csdn.net/hackbuteer1/article/details/7487694C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:[cpp]view plaincopy#includeusingnamespacestd;staticintn;//定义静态全局变量voidfn() 阅读全文
posted @ 2013-11-12 15:52 Andy Niu 阅读(298) 评论(0) 推荐(0) 编辑
python读写文件
摘要:考虑下面的需求:txt文件每行有一个元素,读取所有的元素,排序输出到另一个文件。 1 import sys 2 print(sys.path[0]+"/aaa.txt") 3 file = open(sys.path[0]+"/aaa.txt") 4 result =[] 5 for line in file: 6 result.append(line) 7 8 result.sort() 9 result.reverse()10 11 print(sys.path[0]+"/bbb.txt")12 target = open(sys 阅读全文
posted @ 2013-11-12 15:20 Andy Niu 阅读(241) 评论(0) 推荐(0) 编辑
os.getcwd()
摘要:1、os.getcwd():获取当前工作目录,也就是在哪个目录下运行这个程序。举例来说:假设F:\aaa\bbb\ccc目录下有个文件 TestDir.py,打印当前工作目录。进入windows命令行窗口: 在F:\aaa\bbb\ccc运行 python TestDir.py,输出F:\aaa\bbb\ccc 在F:\aaa\bbb运行 python ccc/TestDir.py,输出F:\aaa\bbb 在F:\aaa运行 python bbb/ccc/TestDir.py,输出F:\aaa2、如果我想获取TestDir.py文件所在的目录,怎么办?使用sys.path[0]1 im... 阅读全文
posted @ 2013-11-12 14:28 Andy Niu 阅读(7250) 评论(1) 推荐(2) 编辑
【转】C++ 异常
摘要:一、什么是异常处理 一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以再用户的代码里处理了,不用留给库去发现)。 Bjarne Stroustrup说:提供异常的基本目的就是为了处理上面的问题。基本思想是:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常 阅读全文
posted @ 2013-11-12 10:06 Andy Niu 阅读(16724) 评论(1) 推荐(2) 编辑
C++ 转型
摘要:1、const_static的使用场景:接收一个const对象,但是想改变对象内容,使用const_static去除对象的常量性,然后可以修改对象。2、dynamic_static的使用场景:从子类向父类转化符合里氏代换,总是安全的。因此dynamic_static的使用场景主要是父类转化为子类,首先转化的结果必须是指针或者引用(指针转化失败返回Null,引用转化错误抛出异常),其次,要转化的对象必须是多态类型,所谓多态类型,也就是类型必须公有继承其他类,或者拥有虚函数(继承或者自定义)。3、reinterpret_cast的使用场景:有一个方法指针FunPtr,(void)(void),有一 阅读全文
posted @ 2013-11-11 20:00 Andy Niu 阅读(421) 评论(0) 推荐(0) 编辑
理解模版
摘要:1、解决的问题:考虑下面的需求,现在有一个方法Fun,形参是实体A,在方法内调用A的启动方法,A.Start(),实体A可能是电脑,也可能使汽车,也可能使空调,对于每一类实体都要写一个内容相同的方法,这些方法构成过载。有没有更好的办法呢? 模版就是问了解决这个问题,通过使用一个占位符,再调用方法的时候,让编译器自动生成一个方法。2、模版是自动化的过载,是延迟的过载。如何理解? 首先,在调用方法的时候,编译器根据类型实参,自动生成一个过载方法。其次,一般的过载方法是在调用之前,就要写好,而模版是在调用的时候,才自动生成对应的方法。3、模版是编译时多态。对于上面提到的问题,还有一个解决办法,那.. 阅读全文
posted @ 2013-11-11 19:32 Andy Niu 阅读(257) 评论(0) 推荐(0) 编辑
快速排序
摘要:1、思路不对,编出的代码肯定不对,因此编码之前,一定要现在草稿纸上,根据思路写出伪码。2、快速排序的思路:选一个目标,把数组分成两块,左边一块都比目标小,右边一块都比目标大。对每一块,递归做同样的事情,递归的出口时,左起点大于等于右起点。3、递归的形参表为:数组和排序的区间,排序区间也就是左起点和右起点,QuickSort(int a[], int lhs,int rhs),递归出口:if(lhs>=rhs) return;4、方法1:思路是对排序的区间做一个拷贝,取第一个为目标,从第二个开始,遍历排序区间,比目标小,从前往后。以此放在原数组区间的左边,比目标大,从后向前,一次放在原数组 阅读全文
posted @ 2013-11-10 10:51 Andy Niu 阅读(399) 评论(0) 推荐(0) 编辑
C# String.Format
摘要:C货币string.Format("{0:C3}", 2)$2.000D十进制string.Format("{0:D3}", 2)002E科学计数法1.20E+0011.20E+001G常规string.Format("{0:G}", 2)2N用分号隔开的数字string.Format("{0:N}", 250000)250,000.00X十六进制string.Format("{0:X000}", 12)Cstring.Format("{0:000.000}", 12.2)0 阅读全文
posted @ 2013-11-08 14:08 Andy Niu 阅读(780) 评论(0) 推荐(0) 编辑
理解C++ static
摘要:1、为什么设计static?考虑下面的需求: 在程序运行过程中,在一个范围内,有一个对象大家共享,而且可以多次使用,状态能够保持,对象的生命周期一直持续到程序运行结束。2、静态对象要分配在全局数据区,程序运行期间,不能释放,一直到程序终止。3、静态对象的生命周期是程序的整个运行过程。但是可以限定静态对象的作用域,根据作用域的大小,可分为静态局部对象,静态全局对象。静态局部对象是指方法内的静态对象,静态全局对象是指编译单元里的静态对象。(注意:生命周期是时间概念,作用域是空间概念)4、静态对象只能初始化一次。严格来讲,任何对象都只能初始化一次,而且是在定义的时候。后面再想修改对象的值,只能通过. 阅读全文
posted @ 2013-11-07 20:30 Andy Niu 阅读(1319) 评论(0) 推荐(0) 编辑
程序地址空间
摘要:1、程序地址空间,从下到上(下面是低地址,上面是高地址)分别为全局数据区,堆,栈,堆往上增长,栈往下增长。2、程序运行后,还存在一个代码区,代码区放的是可执行代码,索引了一个个的方法,可认为是数据加工厂。3、全局数据区存放:全局数据,文本常量,具名常量,静态全局量,静态局部量。 阅读全文
posted @ 2013-11-06 21:06 Andy Niu 阅读(466) 评论(0) 推荐(0) 编辑
map的实现
摘要:1、map的实现是使用平衡树,AVL树或者红黑树。2、在无序的情况下,查找为常数时间。有序的时候,查找为对数时间。二叉排序树(BST)就是为了解决这个问题。3、但是,极端情况下,BST的查找效率退化到常数时间,考虑极端不平衡的二叉树,每个节点只有左孩子。4、为了解决上面的问题,就要想办法对BST进行调整,保证查找效率。5、AVL的思路是:每个节点两个孩子节点的高度相差不大于1,这样就保证了BST比较平衡。6、红黑树的思路是:跟和叶子都是黑色,红的两个孩子都是黑色,每条路的黑色个数一样。这样,就保证了最长路径与最短路径的比小于2,也就保证了相对平衡。为什么红黑树可以保证最长路径与最短路径的比小于 阅读全文
posted @ 2013-11-06 20:52 Andy Niu 阅读(622) 评论(0) 推荐(0) 编辑
【S4】使用empty()而不是判断size()是否为0
摘要:1、二者的作用是一样的,结果也是等价的。就是判断集合是否为空。2、二者是等价的,为什么强调使用empty,因为empty效率更高。3、在STL中,对于一般的集合,empty和size都是常数时间。但是对于list,empty是常数时间,size是线性时间;考虑为什么? 考虑增删操作,对于一般的集合,增删是线性时间,因为涉及到元素的移动,增删的同时也就更新了元素个数。但是对list增删,是常数时间,不会更新节点个数。 因此,对于一般的集合,size是实时更新的,empty与size可认为是等价的。但是对于list:对于empty,只需要检查head是否为end就可以了,为常数时间。对于siz.. 阅读全文
posted @ 2013-11-06 20:42 Andy Niu 阅读(541) 评论(0) 推荐(0) 编辑
获取集合的方法
摘要:考虑下面的需求,从配置文件中,读取一些数据,这些数据放到一个集合中,获取集合,使用方法A,完成任务。该怎么做?1、首先明确一点,坚决不能让A返回引用。2、方法A在栈上创建集合,返回集合。不存在内存泄漏的问题,但是要付出copy代价。3、方法A在堆上创建集合,返回集合的指针,copy代价很低,但是会存在内存泄漏的问题。4、主调方法创建一个集合,把集合的引用传递给被调方法A,A修改集合的内容。这个不直观,客户要一些东西,方法A要求客户准备一个容器,A在容器中填充内容。5、采用哪种方法,要看具体的使用场景,如果集合内容很小,copy代价小,就不要用指针,否者用指针。6、还要考虑另外一种情况,返回的集 阅读全文
posted @ 2013-11-06 20:21 Andy Niu 阅读(657) 评论(0) 推荐(0) 编辑
VS 统计代码行数
摘要:使用正则表达式: ^:b*[^:b#/]+.*$简单说明如下:^:行头$:行尾+:一个或多个*:0个或多个:b:表示空白,匹配空格或者制表符# 表示后面是include,/表示注释^:b*[^:b#/]+.*$ 查找一些行,行的开头有多个空白,后面不是空白,不是#,不是/,这个正则表达式不能剔除 /****/中的后面两行。 阅读全文
posted @ 2013-11-06 19:59 Andy Niu 阅读(1139) 评论(0) 推荐(0) 编辑
\r,\n,\t
摘要:\r:回车符,返回到这一行的开头,return的意思。\n:换行符,到下一行的同一位置,纵坐标相同,new line的意思。\t:制表符,为了在不使用表格的情况下,上下对齐,table的意思。Enter 相当于\n\r,所以Enter的标识为 往下,再往前。当然,\n\r等价于\r\n。 阅读全文
posted @ 2013-11-06 14:17 Andy Niu 阅读(6563) 评论(0) 推荐(1) 编辑
指针的删除动作
摘要:指针的删除动作,如果是安全的操作,必须保证:1、此指针由new返回,说明对象分配在堆上,而不是在栈上,或者其他位置。2、指向的对象确实不再使用,如果对象还在使用,销毁了对象,指针成为野指针,指向垃圾。 阅读全文
posted @ 2013-11-06 13:50 Andy Niu 阅读(395) 评论(0) 推荐(0) 编辑
C++ 名称空间
摘要:在程序中,只使用 using namespace std; 而不使用其他的名称空间,如using namespace boost; 这样的好处有:1、可以避免不同名称空间中的名称冲突;2、可以很清楚地知道某个东西在哪个名称空间内。因为在std中的东西,不再需要使用std::,而在其他名称空间内的必须使用对应的名称空间。 阅读全文
posted @ 2013-11-06 13:37 Andy Niu 阅读(279) 评论(0) 推荐(0) 编辑
boost::token_compress_on
摘要:对于场景:string s = "123456",用"3","4"切分,默认情况下(boost::token_compress_off),切分结果为12,空,56,注意,这里的空不是空格。而是"3","4"之间的空。如果不想要这个空,指定boost::token_compress_on就行了。boost::token_compress_on的意思就是说,以"3","4",切分,当出现34的时候,就把34压缩成整体,用"34"切分。 阅读全文
posted @ 2013-11-06 12:24 Andy Niu 阅读(4916) 评论(0) 推荐(1) 编辑
指针与引用
摘要:1、引用的使用场景:必须指向某个对象(不能指向Null),并且从始至终都指向这个对象。还有一种情况:操作符的返回值要求是引用,这样就可以对它赋值。2、指针的使用场景:不适合使用引用,就使用指针。3、能使用引用,尽量使用引用。因为引用相对更高效,不需要判断指向是否为Null4、引用相对更安全,引用和指针都有不安全的情况,也就是指向的内容被销毁了。5、指针指向的内容被销毁,该指针就是野指针,野指针不是Null指针。产生野指针的情况有: a、指针变量没有初始化,指针变量创建时,取值是随机的,不是Null,因此指针变量定义时,要么初始化为Null,要么初始化为合法的内存。 b、对指针进行了dele.. 阅读全文
posted @ 2013-11-06 12:14 Andy Niu 阅读(428) 评论(0) 推荐(0) 编辑
容器的end()方法
摘要:容器的end()方法,返回一个迭代器,需要注意:这个迭代器不指向实际的元素,而是表示末端元素的下一个元素,这个迭代器起一个哨兵的作用,表示已经处理完所有的元素。因此,在查找的时候,返回的迭代器,不等于end(),说明找到了目标。等于end(),说明检查了所有元素,没有找到目标。 阅读全文
posted @ 2013-11-05 21:07 Andy Niu 阅读(999) 评论(0) 推荐(0) 编辑
C++ map注意事项
摘要:1、在map中,由key查找value时,首先要判断map中是否包含key。2、如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题,如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null。3、map提供了两种方式,查看是否包含key,m.count(key),m.find(key)。4、m.count(key):由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。5、m.find(key):返回迭代器, 阅读全文
posted @ 2013-11-05 20:58 Andy Niu 阅读(72307) 评论(0) 推荐(3) 编辑
C++ foreach
摘要:考虑下面的需求,对vector中的每个元素加1,如何做?1 void add(int& lhs) // 注意:要修改主调方法中的数据,这里要使用引用2 {3 lhs= lhs + 1;4 }5 int intArray[] = {1,2,3,4,5};6 vector intVector(intArray,intArray+5);1、最原始的做法:1 for(vector::iterator iter=intVector.begin();iter!=intVector.end();iter++)2 {3 add(*iter);4 }2、使用类似b... 阅读全文
posted @ 2013-11-05 20:00 Andy Niu 阅读(59683) 评论(0) 推荐(1) 编辑
【转】理解红黑树
摘要:树型结构一直是一种很重要的数据结构, 我们知道二叉查找树BST提供了一种快速查找, 插入的数据结构. 相比散列表来说BST占用空间更小,对于数据量较大和空间要求较高的场合, BST就显得大有用处了.BST的大部分操作平均运行时间为O(logN), 但是如果树是含N个结点的线性链,则最坏情况运行时间会变为O(N). 为了避免出现最坏情况我们给它增加一些平衡条件, 使它的高度最多为2log(N+1), 最坏情况下运行是间花费也接近O(logN), 这就是我下面要讨论的红黑树.由于红黑树的插入和删除是相对复杂的操作,所以这里我将重点讨论这两种操作.AVL树在理解红黑树之前最好先来看看AVL树, 相比 阅读全文
posted @ 2013-11-04 21:08 Andy Niu 阅读(643) 评论(0) 推荐(0) 编辑
概要设计注意事项
摘要:负责一个项目,概要设计大概分为以下几个过程:1、确定边界:确定边界后,才能明确与外部哪些实体交互,交互需要确定:通信方式是串口还是网络,消息的大小,消息的格式,消息是同步还是异步。2、划模块:模块之间有竖直关系和水平关系,比如MVVM模式可以认为是竖直关系,从外部的界面到内部的数据。水平关系比如:接受消息,处理消息,转发消息。3、定接口:模块可以认为是一个IPO(Input-Process-Output)控件,概设的时候,模块是一个黑盒,对外的接口要尽量小。4、理流程:使用时序图,说明对于一个功能,若干模块是如何协作完成的。 阅读全文
posted @ 2013-11-04 19:07 Andy Niu 阅读(714) 评论(1) 推荐(0) 编辑
C++ 初始化与赋值
摘要:1、初始化与赋值的区别: 二者的区别不是看,是否有=这个赋值操作符,而是看操作的时候,对象是否已经有值。 初始化:创建对象,并给它设置初始值。 赋值:对象已经有值,擦除对象的当前值,并使用新值代替。2、初始化分为直接初始化和copy初始化。 直接初始化:直接调用与实参匹配的构造方法。 copy初始化:也叫copy构造,总是调用copy构造方法。copy构造方法就是这样的,Person(const Person& rhs),也就是根据已有的对象,copy对象的内容,形成一个副本。3、一方面:定义对象的时候,肯定调用某个构造方法进行了初始化,包括显示或者隐式。另一方面,对象的初始化必须是. 阅读全文
posted @ 2013-11-04 18:34 Andy Niu 阅读(982) 评论(0) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示