摘要: “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用 阅读全文
posted @ 2014-03-06 22:18 zzyoucan 阅读(601) 评论(0) 推荐(0) 编辑
摘要: bind - boost头文件: boost/bind.hppbind 是一组重载的函数模板.用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象.它的源文件太长了. 看不下去. 这里只记下它的用法:9.1 对于普通函数假如有函数 fun() 如下: void fun(int x, int y) { cout (f, 3)(); //指出返回值的类型 void 9.2 对于非静态成员函数假如有: struct A { void func(int x, int y) { cout ptr_a(pa); //智能指针. 现在要向像 A::func 这样的非静态... 阅读全文
posted @ 2014-03-06 18:18 zzyoucan 阅读(1217) 评论(0) 推荐(0) 编辑
摘要: map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。 map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。 使用map容器需要头文件包含语句“#include”, map文件也包含了对multimap多重映照容器的定义。 1、map创建、元素插入和遍历访问 创建map对象,键值与映照数据的类型由自己定义。在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,下面这个程序详细说明了如何操作ma... 阅读全文
posted @ 2014-03-06 15:52 zzyoucan 阅读(329) 评论(0) 推荐(0) 编辑
摘要: IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。 调用的步骤如下: 抽象出一个完成端口大概的处理流程: 1:创建一个完成端口。 2:创建一个线程A。 3:A线程循环调用GetQueuedCompletionStatus 阅读全文
posted @ 2014-03-05 09:54 zzyoucan 阅读(724) 评论(0) 推荐(0) 编辑
摘要: 很久没有遇到像never grow old这样歌曲,这首歌是高中时,英语报纸后面的一首歌,挺第一次就感觉这个不错,大一大二是我发现好歌的黄金期,每次到学校的网吧下个几百首,然后捡好听的听,和室友讨论歌曲和乐队,如小红莓,yellow等,朋友的步步高手机里面的歌,我当时听怎么感觉很奇怪,但听着听着感觉不错。现在怎么发现这些乐队突然都消失了,现在听的都是一些流行的歌曲。Taylor Swift,katy perry歌可以说也是流行歌,时间长了没啥意思。还有微博自从上次整治之后感觉百无聊赖了,有点死沉的感觉。你看热门微博不是搞笑的就是娱乐大明星,感觉微博真不如以前了。 阅读全文
posted @ 2014-03-04 22:09 zzyoucan 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 对sunway程序中的BUG所进行的修改需要注意的是Sunway上面文章“深入A*算法”中引用了一个A*的游戏程序进行讲解,并有这个源码的下载,不过它有一个不小的Bug, 就是新的子节点放入OPEN表中进行了排序,而当子节点在Open表和Closed表中时,重新计算估价值后,没有重新的对Open表中的节点排序,这个问题会导致计算有时得不到最优解,另外在路网权重悬殊很大时,搜索范围不但超过Dijkstra,甚至搜索全部路网, 使效率大大降低。 Drew 对这个问题进行了如下修正,当子节点在Open表和Closed表中时,重新计算估价值后,删除OPEN表中的老的节点,将有新估价值的节点插入OPE. 阅读全文
posted @ 2014-03-04 16:53 zzyoucan 阅读(1371) 评论(0) 推荐(0) 编辑
摘要: 一、前言 在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子。值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇《初识A*算法》。 这里所举的例子是参考AMIT主页中的一个源程序,使用这个源程序时,应该遵守一定的公约。二、A*算法的程序编写原理 我在《初识A*算法》中说过,A*算法是最好优先算法的一种。只是有一些约束条件而已。我们先来看看最好优先算法是如何编写的吧。 如图有如下的状态空间:(起始位置是A,目标位置是P,字母后的数字表示节点的估价值) 搜索过程中设置两个表:OPEN和CLOSED。OPEN表保存... 阅读全文
posted @ 2014-03-04 11:43 zzyoucan 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与。 还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人工智能在游戏中的代表。 A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法。一、何谓启发式搜索算法 在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有... 阅读全文
posted @ 2014-03-04 11:36 zzyoucan 阅读(493) 评论(0) 推荐(0) 编辑
摘要: 1 基础主题:秒表 下面我们要为一个机械秒表建模一个状态机。这样一个秒表通常会有两个按钮。 * Start/Stop * Reset 同时有两种状态: * Stoped: 表针停留在上次停止时的位置: o 按下Reset按钮,表针回退到0的位置。秒表保持在Stoped状态不变。 o 按下Start/Stop按钮,秒表转到Running状态。 * Running: 表针在移动,并持续显示过去的时间: o 按下Reset按钮,表针回退到0的位置,秒表转到停止状态。 o 按下Start/Stop按钮... 阅读全文
posted @ 2014-03-03 18:52 zzyoucan 阅读(840) 评论(0) 推荐(0) 编辑
摘要: Template模板方法模式作用:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。其关键是将通用算法(逻辑)封装在抽象基类中,并将不同的算法细节放到子类中实现。UML图如下:AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶层逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到之类实现。顶层逻辑也有可能调用一些具体方法。ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个Co 阅读全文
posted @ 2014-03-03 18:16 zzyoucan 阅读(389) 评论(0) 推荐(0) 编辑