随笔分类 -  c++

上一页 1 ··· 11 12 13 14 15
摘要: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 阅读(767) 评论(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 阅读(1402) 评论(0) 推荐(0)
摘要:一、前言 在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子。值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇《初识A*算法》。 这里所举的例子是参考AMIT主页中的一个源程序,使用这个源程序时,应该遵守一定的公约。二、A*算法的程序编写原理 我在《初识A*算法》中说过,A*算法是最好优先算法的一种。只是有一些约束条件而已。我们先来看看最好优先算法是如何编写的吧。 如图有如下的状态空间:(起始位置是A,目标位置是P,字母后的数字表示节点的估价值) 搜索过程中设置两个表:OPEN和CLOSED。OPEN表保存... 阅读全文
posted @ 2014-03-04 11:43 zzyoucan 阅读(387) 评论(0) 推荐(0)
摘要:写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与。 还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人工智能在游戏中的代表。 A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法。一、何谓启发式搜索算法 在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有... 阅读全文
posted @ 2014-03-04 11:36 zzyoucan 阅读(515) 评论(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 阅读(930) 评论(0) 推荐(0)
摘要:Template模板方法模式作用:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。其关键是将通用算法(逻辑)封装在抽象基类中,并将不同的算法细节放到子类中实现。UML图如下:AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶层逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到之类实现。顶层逻辑也有可能调用一些具体方法。ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个Co 阅读全文
posted @ 2014-03-03 18:16 zzyoucan 阅读(398) 评论(0) 推荐(0)
摘要:Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。 OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与.. 阅读全文
posted @ 2014-03-02 16:22 zzyoucan 阅读(10208) 评论(0) 推荐(3)
摘要:介绍 Boost状态机库一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器。它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对状态机进行一次文本描述一样具体可读性。如何阅读这个教程 这个教程是以线性阅读的方式进行的章节设计。如果你是第一次看这个教程的话,你可以从头开始读,到你觉得了解的东西对你手头的任务来说已经足够时就停止。具体可以这样: * 如果你的任务是要实现一个小的、简单的,并且有很少几个状态的状态机,那么下面的“初级主题:秒表”里所讲的就差不多够你用的了。 * 如果你要做一个有很多状态... 阅读全文
posted @ 2014-02-28 17:17 zzyoucan 阅读(2771) 评论(0) 推荐(0)
摘要:std::function 和 std::bind标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int f(int, char, double); // 绑定f()函数调用的第二个和第三个参数, // 返回一个新的函数对象为ff,它只... 阅读全文
posted @ 2014-02-27 17:04 zzyoucan 阅读(445) 评论(0) 推荐(0)
摘要:在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已。std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移问题。这导致多个std::auto_ptr类型的局部变量不能共享同一个资源,这个问题是非常严重的哦。因为,我个人觉得,智能指针内存管理要解决的根本问题是:一个堆对象(或则资源,比如文件句柄)在被多个对象引用的情况下,何时释放资源的问题。何时释放很简单,就是在最后一个引用它的对象被释放的时候释放它。关键的问题在于无法确定哪个引用它的对象是被最后释放的。std::shared_ptr确定最后一个引.. 阅读全文
posted @ 2014-02-27 16:07 zzyoucan 阅读(586) 评论(0) 推荐(0)
摘要:《Boost程序库探秘——深度解析C++准标准库》之试读 前一阵子还看到一篇文章,说C#要重蹈C++的覆辙,这里说的C++的覆辙是什么呢?是指C++语言过于臃肿的功能特性,导致学习人员的流失。文章说,语言最后的威力是“开发软件”,而不是“比拼新特性”在大学中,C++算是比较难学的语言。有些学校试图直接让学生们学习C++,结果效果不怎么好。这次,C++11又添加了大量新特性,如lambda,auto等,把C++弄的像动态语言一样。添加了那么多新特性,而为了照顾用户的习惯和已有的代码。又不能去除一些旧的特性,这样导致了C++越来越臃肿和复杂。记得在哪里看过,好像是塞伯斯塔的程序设计语言一书中说的吧 阅读全文
posted @ 2014-02-27 14:52 zzyoucan 阅读(523) 评论(0) 推荐(0)
摘要:从C++出来到现在已经13年了。Bjarne Stroustrup(C++的创造者)最近评价C++11:”感觉像个新的语言“。事实上,C++11核心已经发生了很重大的变化:1. 支持Lambda表达式( lambda expressions)2. 对象自动类型推导(automatic type deduction of objects)3. 统一初始化语法(uniform initialization syntax)4. 代理构造(delegating constructors)5. deleted 和defaulted函数声明(deleted and defaulted function d 阅读全文
posted @ 2014-02-27 14:35 zzyoucan 阅读(546) 评论(0) 推荐(0)
摘要:C++标准库的所有头文件都没有扩展名。C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能。 形式的标准头文件【 例外】其内容与ISO标准C包含的name.h头文件相同,但容纳了C++扩展的功能。在 形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明。在C++中还可以使用name.h形式的标准C库头文件名。C++标准库的内容分为10类:C1.语言支持 C2.输入/输出 C3.诊断 C4.一般工具 C5.字符串C6.容器 C7.迭代器支持 C8.算法 C9.数值操作 C10.本地化C1 标准库中与语言支持功能相关的头文件 头文件 描述 .. 阅读全文
posted @ 2014-02-27 14:24 zzyoucan 阅读(1260) 评论(0) 推荐(0)
摘要:C++ primer 上面的一个例子: // constRef.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"class constRef{public: constRef(int ii); int i; const int ci; int &ri;};constRef::constRef(int ii){ i=ii; ci=ii; ri=i;}//constRef::constRef(int ii):i(ii),ci(i),ri(ii){}int _tmain(int argc, _TCHAR* argv[]){ constRe 阅读全文
posted @ 2014-02-26 23:53 zzyoucan 阅读(5117) 评论(0) 推荐(0)
摘要:在C程序中包含文件有以下两种方法:(1)用符号“”将要包含的文件的文件名括起来。这种方法指示预处理程序到预定义的缺省路径下寻找文件。预定义的缺省路径通常是在INCLUDE环境变量中指定的,请看下例: INCLUDE=C:\COMPILER\INCLUDE;S:\SOURCE\HEADERS;对于上述INCLUDE环境变量,如果用#include语句包含文件,编译程序将首先到C:\COMPILER\INCLUDE目录下寻找文件;如果未找到,则到S:\SOURCE\HEADERS目录下继续寻找;如果还未找到,则到当前目录下继续寻找。(2)用双引号将要包含的文件的文件名括起来。这种方法指示预处理程序 阅读全文
posted @ 2014-02-26 11:15 zzyoucan 阅读(476) 评论(0) 推荐(0)
摘要:首先,vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。也就是说set能够保证它里面所有的元素都是不重复的。另外对set容器进行插入时可以指定插入位置或者不指定插入位置。如insert(v.begin(),1),也可以直接用insert(1)。还有一点是set对一些操作符没有进行重载,如#include#include#include#includeusingnamespacestd;intmain(void){vectorv;v.insert(v.begin(),1);//如果使用insert(1)不指定插入位置,会出错v.insert(v.begin() 阅读全文
posted @ 2014-02-25 21:51 zzyoucan 阅读(818) 评论(0) 推荐(0)
摘要:摘要:本文列出几个基本的STL map和STL set的问题,通过解答这些问题讲解了STL关联容器内部的数据结构,最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set选择问题,并分析了map, set的优势之处。对于希望深入学习STL和希望了解STL map等关联容器底层数据结构的朋友来说,有一定的参考价值。vector(向量)——STL中标准而安全的数组。只能在vector 的“前面”增加数据。deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。list(列表)——游标一次只可以移动一步。如果你对链表 阅读全文
posted @ 2014-02-25 21:44 zzyoucan 阅读(284) 评论(0) 推荐(0)
摘要:类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。C语言的类型安全C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将会报告错误,除非 阅读全文
posted @ 2014-02-24 23:05 zzyoucan 阅读(561) 评论(0) 推荐(0)
摘要:“生成”的时候,只对你改动过的文件重新生成,没有改动过的文件不会重新生成;“重新生成”是对所有的文件都重新生成。以cpp为例,当你只改动某些.cpp之类的文件的时候,可以用生成,省了编译没有改动的那些文件的时间;但是如果你改动了某些.h之类的文件,最好用重新生成,因为有可能有些文件包含.h文件也需要重新编译。.cpp在编译的时候需要,.h在链接的时候需要 阅读全文
posted @ 2014-02-24 10:18 zzyoucan 阅读(627) 评论(0) 推荐(0)

上一页 1 ··· 11 12 13 14 15