自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

烽火前秦路

对待知识,犹如飞蛾扑火般热情!

  • 博客(58)
  • 资源 (6)
  • 收藏
  • 关注

原创 剑指Offer----面试题八:旋转数组的做小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2,}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.思路一:按照传统思路,将数组中的值一个个相互比较,取出来做小的数字。源代码如下:#includeusing std::cout

2016-05-22 13:24:01 468

原创 剑指Offer----面试题七:用两个栈实现队列

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。templateclass CQueue{public: CQueue(void) {}; ~CQueue(void); void appendTail(const T& node); T deleteHead();

2016-05-21 23:28:57 381

转载 空基类优化EBO之深度探索

引自空基类优化EBO之深度探索继承情景   我们知道一个空的类,也就是其内部没有非静态数据成员,没有虚指针(包括指向虚函数表和虚基类子对象的指针),它的大小通常为1,当然在某些对齐要求严格系统上可能是另一个数(通常是4),如果空类被继承,那么派生类的大小会怎么样呢?一个支持C++标准和EBO的编译器对此会进行空基类的优化,也就是不给空的基类子对象分配空间,换句话说,空基

2016-05-20 21:21:03 575

原创 具有虚函数的类的大小 & VS2010命令行查看虚函数表和类内存布局

VS2010命令行查看虚函数表和类内存布局以下内容引自VS2010命令行下查看虚函数表和类内存布局——《深度探索C++对象模型》读书札记系列 在学习多重继承下的Virtual functions时,需要分析派生类的虚函数表(vtable),但是在网上找了好几种Hack vtable方法,结果都不尽如人意。没想到MS Compiler(以VS2

2016-05-20 19:21:26 1330 1

原创 剑指Offer----面试题六:重建二叉树

前言:二叉树有多种遍历方式,这里主要讲其中的三种遍历方式六种实现方法(递归和非递归)。递归方式且看后边源代码。这里主要讲三种非递归实现方法。以下内容引自三种遍历方式的非递归实现    为了便于理解,这里以下图的二叉树为例,分析二叉树的三种遍历方式的实现过程。          1、前序遍历的非递归实现 根据先序遍历的顺

2016-05-20 12:25:52 531

原创 剑指Offer----面试题五:从尾到头打印链表

前述:链表的创建、结点的插入、结点的删除等操作都只需要20行左右的代码就能实现,其代码量比较适合面试。链表问题:面试题5“从尾到头输出链表”、面试题13“在O(1)时间删除链表结点”、面试题15“链表中的倒数第k个结点”、面试题16“反转链表”、面试题17“合并两个排序的链表”、面试题37“两个链表的第一个公共结点”、面试题45“圆圈中最后剩下的数字”、面试题27“二叉搜索树与双向链表”、

2016-05-19 22:32:10 535

原创 剑指Offer----面试题四之相关题目

题目:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中所有的数字插入到A1中并且所有的数字是排序的。思路一:不管三七二十一,先插入,再排序。思路二:根据面试题四的思路,从后向前依次插入。源代码:#include//参数分别代表:数组A,数组A中元素的个数,数组A的长度,数组B,数组B中元素的个数void Add(in

2016-05-19 18:02:50 549

原创 剑指Offer----面试题四:替换空格

预备知识:C/C++把常量字符串放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。但是用常量内存初始化数组,情况却不相同。代码如下:#includeusing namespace std;int main(){ char *ch1 = "ABCD"; char *ch2 = "ABCD"; if (ch1 ==

2016-05-19 11:20:04 519

原创 剑指Offer----面试题三:二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。如下面的数组,查找数字7,找到返回true;否则,返回false。二维数组中的查找12892491247101368

2016-05-19 10:40:28 569

原创 剑指Offer----面试题二:实现Singleton模式

题目:设计一个类,我们只能生成该类的一个实例。详解请参考More Effective C++ 第26款:限制某个类所能产生的对象的数量在这里我将给出三个实例:实例一:一个类只能产生一个对象#include#include//类的声明namespace MyStrSpace{ class MyStr{ public: void print(){ std::co

2016-05-18 22:26:11 1612

原创 剑指Offer----面试题一:为类添加赋值运算符函数

题目:如下类型CMyString的声明,请为该类型添加赋值运算符函数class CMyString{public: CMyString(char *pData = NULL); CMyString(const CMyString & str); ~CMyString(void);private: char *pData;};思路:返回类型必须是引用类型

2016-05-18 18:17:13 614

原创 AVL树

AVL树是带有平衡条件的二叉查找树。一颗AVL树是其每个结点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定义为-1)。在插入新节点以后,只有那些从插入点到根节点的路径上的结点的平衡有可能会被改变,因为只有这些结点的子树可能发生改变。把必须重新平衡的结点叫做a,由于任意结点最多有两个儿子,因此高度不平衡时,a点的两颗子树的高度差2。单旋转

2016-05-18 16:26:04 472

转载 理解typename的两个含义

typename深度理解

2016-05-18 12:17:34 352

原创 二叉查找树

二叉树二叉树是一颗每个结点都不能多于两个儿子的树。结点实现具有N个结点的每一颗二叉树都需要N+1个NULL链。//二叉树结点类 struct BinaryNode { Comprarable element; //The data in the node; BinaryNode *left; //left child BinaryNode *r

2016-05-17 22:51:45 581

原创 Effective C++ 3e----new & delete(八)条款2:写了placement new也要写placement delete

2016-05-13 15:58:07 504

原创 Effective C++ 3e----new & delete(八)条款51:编写new和delete时需固守常规

#includevoid *operator new(std::size_t size) throw(std::bad_alloc)//你的operator new可能接受额外的参数{ using namespace std; if (0 == size)//处理0-byte申请,将它视为1-byte申请 size = 1; while (true) { 尝试分配size

2016-05-13 15:38:36 406

原创 Effective C++ 3e----new & delete(八)条款50:了解new和delete的合理替换时机

2016-05-13 12:33:28 427

原创 Effective C++ 3e----new & delete(八)条款49:了解new-handler的行为

当我看到C++ Primer 第五版中介绍new和operator操作符的时候我非常惊叹C++的强大功能,于是趁热打铁读了More Effective C++中关于new和delete操作的有关章节,本以为自己对new和delete操作符及其内存机制已然了解的足够深入,但当我读到《STL源码剖析》的时候,又一次傻眼了,什么叫new_handler,set_new_handler又有什么作用,当

2016-05-13 12:25:26 620

原创 gcc & makefile

gcc使用gcc,程序员可以对编译过程有更多的控制,编译过程可分为3个阶段预处理汇编链接程序员可以在编译的任何阶段结束后停止整个编译过程以检查编译器在该阶段输出的信息。预处理将源代码和头文件结合在一起,也就是将头文件中的内容拷贝一份到原文中中;编译就是讲预编译的文件编译成二进制文件;将库中的文件链接进来,实现链接生成可执行文件

2016-05-12 15:42:37 383

转载 Effective C++----3rd Edition, Item 3:尽可能使用const

Item 3: 只要可能就用 const作者:Scott Meyers译者:fatalerror99 (iTePub's Nirvana)发布:http://blog.csdn.net/fatalerror99/关于 const 的一件美妙的事情是它允许你指定一种 semantic(语义上的)约束:一个特定的 object(对象)不应该被修改。而 com

2016-05-10 23:50:20 536

转载 Effective C++----3rd Edition, Item 2:用consts,enums和inlines取代#define

Item 2: 用 consts, enums 和 inlines 取代 #defines作者:Scott Meyers译者:fatalerror99 (iTePub's Nirvana)发布:http://blog.csdn.net/fatalerror99/这个 Item 改名为“用 compiler(编译器)取代 preprocessor(预处理器)”也许更好

2016-05-10 21:25:48 406

转载 Effective C++----3rd Edition, Item 1:将C++视为语言的联合体

Item 1: 将 C++ 视为 federation of languages(语言联合体)作者:Scott Meyers译者:fatalerror99 (iTePub's Nirvana)发布:http://blog.csdn.net/fatalerror99/最初,C++ 仅仅是在 C 的基础上附加了一些 object-oriented(面向对象)的特性。C+

2016-05-10 20:10:25 377

原创 Google C++ Style Guide----作用域

二、作用域1. 命名空间(Namespaces)在.cc 文件中,提倡使用不具名的命名空间(unnamed namespaces,译者注:不具名的 命名空间就像不具名的类一样,似乎被介绍的很少:-()。使用具名命名空间时,其名称可基于项目或路径名称,不要使用 using 指示符。定义:命名空间将全局作用域细分为不同的、具名的作用域,可有效防止全局作用域的命名 冲突。

2016-05-09 18:13:31 786

原创 Google C++ Style----头文件

一、头文件通常,每一个.cc 文件(C++的源文件)都有一个对应的.h 文件(头文件),也有一些例 外,如单元测试代码和只包含 main()的.cc 文件。正确使用头文件可令代码在可读性、文件大小和性能上大为改观。 下面的规则将引导你规避使用头文件时的各种麻烦。1. #define 的保护所有头文件都应该使用#define 防止头文件被多重包含(multiple inc

2016-05-09 17:51:31 1439

原创 Google C++ Style Guide----英文版

BackgroundC++ is the main development language used by many of Google's open-source projects. As every C++ programmer knows, the language has many powerful features, but this power brings with it

2016-05-09 17:02:26 3143

原创 More Effective C++----(28)灵巧(smart)指针

Item M28:灵巧(smart)指针

2016-05-07 15:50:39 1499 1

原创 More Effective C++----(27)要求或禁止在堆中产生对象

Item M27:要求或禁止在堆中产生对象有时你想这样管理某些对象,要让某种类型的对象能够自我销毁,也就是能够“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候你想获得一种保障:“不在堆中分配对象,从而保证某种类型的类不会发生内存泄漏。”如果你在嵌入式系统上工作,就有可能遇到这种情况,发生在嵌入式系统上的内存泄漏是极其严重的,其堆空间是非常珍贵的。

2016-05-07 15:39:39 835

原创 More Effective C++----(26)限制某个类所能产生的对象数量

Item M26:限制某个类所能产生的对象数量你很痴迷于对象,但是有时你又想束缚住你的疯狂。例如你在系统中只有一台打印机,所以你想用某种方式把打印机对象数目限定为一个。或者你仅仅取得16个可分发出去的文件描述符,所以应该确保文件描述符对象存在的数目不能超过16个。你如何能够做到这些呢?如何去限制对象的数量呢?如果这是一个用数学归纳法进行的证明,你会从n=1开始证明,然后从此出发

2016-05-07 14:46:54 1230

原创 More Effective C++----技巧 & (25)将构造函数和非成员函数虚拟化

技巧本书涉及的大多数内容都是编程的指导准则。这些准则虽是重要的,但是程序员不能单靠准则生活。有一个很早以前的卡通片叫做“菲利猫”(Felix the Cat), 菲利猫无论何时遇到困难,它都会拿它的trick包。如果一个卡通角色都有一个trick包,那么C++程序员就更应该有了。把这一章想成你的trick包的启动器。当设计C++软件时,总会再三地受到一些问题的困扰。你如何让

2016-05-06 23:30:11 2889

原创 More Effective C++----(24)理解虚拟函数、多继承、虚继承和RTTI所需的代价

Item M24:理解虚拟函数、多继承、虚继承和RTTI所需的代价C++编译器们必须实现语言的每一个特性。这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性。在多数情况下,你不用关心这些事情。然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些特性有一个基本的了解,知道编译器可能在背后做了些什么,就显得很重要。这种特性中最重要的例子是

2016-05-06 21:51:18 1098 1

原创 More Effective C++----(23)考虑变更程序库

Item M23:考虑变更程序库程序库的设计就是一个折衷的过程。理想的程序库应该是短小的、快速的、强大的、灵活的、可扩展的、直观的、普遍适用的、具有良好的支持、没有使用约束、没有错误的。这也是不存在的。为尺寸和速度而进行优化的程序库一般不能被移植。具有大量功能的的程序库不会具有直观性。没有错误的程序库在使用范围上会有限制。真实的世界里,你不能拥有每一件东西,总得有付出。

2016-05-06 20:41:56 581

原创 More Effective C++----(22)考虑用运算符的赋值形式(op=)取代其单独形式(op)

Item M22:考虑用运算符的赋值形式(op=)取代其单独形式(op)大多数程序员认为如果他们能这样写代码:x = x + y; x = x - y;那他们也能这样写:x += y; x -= y;如果x和y是用户定义的类型(user-defined type),就不能确保这样。就C++来说,operator+、operator=和operator+=之间没有

2016-05-06 20:12:34 585

原创 More Effective C++----(21)通过重载避免隐式类型转换

Item M21:通过重载避免隐式类型转换(读这一节内容之前,建议回顾C++转换构造函数和隐式转换函数的相关知识。)以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西:class UPInt { // unlimited precisionpublic:

2016-05-06 18:19:54 1141

原创 More Effective C++----(20)协助完成返回值优化

Item M20:协助完成返回值优化一个返回对象的函数很难有较高的效率,因为传值返回会导致调用对象内的构造和析构函数(参见条款M19),这种调用是不能避免的。问题很简单:一个函数要么为了保证正确的行为而返回对象要么就不这么做。如果它返回了对象,就没有办法摆脱被返回的对象。就说到这。考虑rational(有理数)类的成员函数operator*:(返回类型为const是为了防止连续

2016-05-06 18:07:11 1114

原创 More Effective C++----(19)理解临时对象的来源

Item M19:理解临时对象的来源当程序员之间进行交谈时,他们经常把仅仅需要一小段时间的变量称为临时变量。例如在下面这段swap(交换)例程里:templatevoid swap(T& object1, T& object2){ T temp = object1; object1 = object2; object2 = temp;}通常把te

2016-05-06 17:35:59 912

原创 More Effective C++----(18)分期摊还期望的计算

Item M18:分期摊还期望的计算在条款M17中,我极力称赞懒惰的优点,尽可能地拖延时间,并且我解释说懒惰如何提高程序的运行效率。在这个条款里我将采用一种不同的态度。这里将不存在懒惰。我鼓励你让程序做的事情比被要求的还要多,通过这种方式来提高软件的性能。这个条款的核心就是over-eager evaluation(过度热情计算法):在要求你做某些事情以前就完成它们。例如下面这个模

2016-05-06 17:09:14 1167

原创 More Effective C++----(17)考虑使用lazy evaluation(懒惰计算法)

Item M17:考虑使用lazy evaluation(懒惰计算法)从效率的观点来看,最佳的计算就是根本不计算,那好,不过如果你根本就不用进行计算的话,为什么还在程序开始处加入代码进行计算呢?并且如果你不需要进行计算,那么如何必须执行这些代码呢?关键是要懒惰。还记得么?当你还是一个孩子时,你的父母叫你整理房间。你如果象我一样,就会说“好的“

2016-05-06 12:29:26 3542

原创 More Effective C++----效率 & (16)牢记80-20准则(80-20 rule)

效率我怀疑一些人在C++软件开发人员身上进行秘密的巴甫洛夫试验,否则为什么当提到“效率”这个词时,许多程序员都会流口水。(Scott Meyers真幽默 译者注)事实上,效率可不是一个开玩笑的事情。一个太大或太慢的程序它们的优点无论多么引人注目都不会为人们所接受。本来就应该这样。软件是用来帮助我们更好地工作,说运行速度慢才是更好的,说需要32MB内存的程序比仅仅需要16MB内存

2016-05-06 11:36:54 1196

原创 More Effective C++----(15)了解异常处理的系统开销

Item M15:了解异常处理的系统开销为了在运行时处理异常,程序要记录大量的信息:无论执行到什么地方,程序都必须能够识别出如果在此处抛出异常的话,将要被释放哪一个对象;程序必须知道每一个入口点,以便从try块中退出;对于每一个try块,他们都必须跟踪与其相关的catch子句以及这些catch子句能够捕获的异常类型。这种信息的记录不是没有代价的。虽然确保程序满足异常

2016-05-06 11:18:51 1100

原创 More Effective C++----(14)审慎使用异常规格(exception specifications)

Item M14:审慎使用异常规格(exception specifications)毫无疑问,异常规格是一个引人注目的特性。它使得代码更容易理解,因为它明确地描述了一个函数可以抛出什么样的异常。但是它不只是一个有趣的注释。编译器在编译时有时能够检测到异常规格的不一致。而且如果一个函数抛出一个不在异常规格范围里的异常,系统在运行时能够检测出这个错误,然后一个特殊函数unexpected

2016-05-05 23:52:04 4154

DetoursExpress.msi

一款小而又强大的软件,C学习路上的必选工具!

2016-04-18

OllyDbg.rar

OllyDbg包含有所有的插件,解压缩即可使用。

2016-04-18

Spy_2.7.rar

不用解释,懂得都懂!

2016-04-18

数据结构经典书籍

本压缩文件包括两本书: 一本是由清华大学出版社,严蔚敏、吴伟民编著的《数据结构》(C语言版) 另外一本是由西安电子科技大学出版社,高一凡编著的《数据结构》算法实现及解析(第二版)。

2016-04-01

FscaptureV8.1

FscaptureV8.1

2016-03-22

典型密码算法及其C语言实现_附录代码实现

典型密码算法及其C语言实现_附录代码实现

2016-03-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除