re: 安全的list[未登录] PeakGao 2008-11-20 13:35
@Jeff Chen
你这种其实就是我上面说的这个意思:“再有一种办法,就是对象要移除时,只设置一个需要移除的标志,在下一轮遍历前才真正移除。”,不过你的说法好像有问题哦,遍历时根本不知道是无效的Connection哦,而且不能在遍历的过程中将节点移入到另一个列表,这样会挂的
re: 安全的list[未登录] PeakGao 2008-11-18 08:58
@不懂
理论上是这样,框架彻底的好就没有问题,但是在游戏更新时,经常有生命期结束的对象,这样的对象需要从地图上面移除,就涉及到从列表中erase,而生命期结束是根据update的调用进行检测的。当然可以有另一个办法,就是将检测放到一个时钟里面,而不是在list的遍历过程中,但是这样会需要好多多余的时钟。再有一种办法,就是对象要移除时,只设置一个需要移除的标志,在下一轮遍历前才真正移除。发现越说越复杂了,总之,这个功能就是用于list遍历很复杂时,也能安全的工作。你的这几行,参考我上面的,就一句it=list.erase(it)迭代器不需要临时保存的!!
for (std::list<int>::iterator it=list.begin(); it!=list.end();)
{
if (条件为真)
{
itTmp = it; // 多余
++itTmp; // 多余
it = list.erase(it); // 删除当前节点
it = itTmp; // 多余
}
else
++it;
}
re: 安全的list[未登录] PeakGao 2008-11-17 10:30
@是什么
是这样的,当list的操作很简单时,遍历list几乎没有什么问题,也可以在遍历的时候删除当前节点,如:
for (std::list<int>::iterator it=list.begin(); it!=list.end();)
{
if (条件为真)
it = list.erase(it); // 删除当前节点
else
++it;
}
但是当这个list不是很简单的遍历时,而且删除的时候也不是很显式的在遍历过程中时,就很容易出问题,如:
void MapManager::update(...)
{
// typedef std::list<Entity*> DisplayList;
for (DisplayList::iterator it=mDisplayList.begin(); it!=mDisplayList.end();)
{
(*it)->update(...);
}
}
但是(*it)->update(...);会调用到另一个模块中去了,可能会这样调用:
void Entity::update(...)
{
//...
MapManager->removeEntity(this);
}
而removeEntity会涉及到erase节点:
void MapManager::removeEntity(Entity* e)
{
mDisplayList.remove(e);
}
如果Entity的update方法中,发现自己的生命期已经结束的话,就会删除自己,这样MapManager::update里面就非法了,这是一个站在砖头上拿掉砖头的问题,必定非法。这个safelist就是为了支持在遍历列表的过程中能安全的erase任何节点。
可能你们没有碰到该类问题,或者使用list的时候没有那么复杂,所以一时没法去了解。
re: 一个小的搜索引擎 PeakGao 2007-11-10 19:56
发邮件给你了,但是发现好像掉了几个问题,呵呵
re: 一个小的搜索引擎 PeakGao 2007-11-10 19:27
加我QQ吧,交个朋友
re: 一个小的搜索引擎 PeakGao 2007-11-10 19:24
re: 一个小的搜索引擎 PeakGao 2007-11-10 19:16
@<a href=
http://minidx.com>minidxer</a>
发现你发帖好快啊,我还没有编辑好,你的回复就来了,看你首页才发现你搞全文检索的,呵呵
re: 有意转让一个搜索引擎 PeakGao 2007-11-10 17:37
@<a href=
http://minidx.com>minidxer</a>
原来写了一个php的搜索功能,但是后来改了程序,就没有继续改,就写了个COM,c++熟悉多了,php不是我的强项
re: 有意转让一个搜索引擎 PeakGao 2007-11-10 17:35
@<a href=
http://minidx.com>minidxer</a>
分词只有那么几种有效的算法,呵呵,我也没有时间去研究一种新的算法,只是为了速度做了改进而已。
没有search.php你还想直接运行exe啊,哈哈,连search.php都只是一个壳,内部调用的COM组件
re: 发布一个正则表达式测试工具 PeakGao 2007-11-10 13:28
@Minidx全文检索
我最后是自己解析的html,这里提供一组测试数据供参考:
三个URL提取器的性能比较,均连续进行3次,
测试新华网主页的url提取: parse www.xinhuanet.com
提取器名称 url数目 耗时(连续3组)
正则表达式(RegexUrlProber) 854 767/561/598 ms
微软DOM(MsDomUrlProber) 952 1132/629/605 ms
我们的(MyDomUrlProber) 952 16/18/15 ms
从数据看,我自己写的html解析程序速度是相当不错的 :)
re: 有意转让一个搜索引擎 PeakGao 2007-11-10 13:24
@<a href=
http://minidx.com>minidxer</a>
虽然分词没有海量的准,但是速度比它声明的还快,经测试1581 bytes/ms,相当于 4743万个汉字/分钟,比海量的 2000万字/分钟 还快,呵呵,只是精度没他的高,我的机器配置并不高:AMD Athlon 2500+,512M DDR内存
re: 有意转让一个搜索引擎 PeakGao 2007-11-10 13:12
@万连文
如果没有用起来,估计有可能发布源代码,但是没有时间表
@Minidx全文检索
执行效率不错,当然比你用纯API写的差,毕竟为了框架的合理和跨平台封装,导致了不少的函数调用开销,但这些对于应用来讲可以忽略,除非你用在某些实时行特别高的地方
re: 终于拿到驾驶证了[未登录] PeakGao 2007-09-22 12:16
re: 发布一个正则表达式测试工具 PeakGao 2007-06-04 09:08
re: 通过批处理来对项目源代码进行打包备份 PeakGao 2007-06-01 12:54
@LOGOLS_
这跟源代码管理是2回事,我没有说用这种方法代替源代码管理,源代码管理我用过vss,cvs和svn,但他们都会产生垃圾文件,当你拷贝代码时,总是不好去掉这些垃圾文件,所以rar打包是一种干净的备份
re: 通过批处理来对项目源代码进行打包备份 PeakGao 2007-06-01 12:51
@flyingxu
放解决方案文件.sln所在目录即可
没反应的话,看看你的rar.exe所在目录设置是否正确
@Starling
asp.net不是很清楚,可能是类似下面的语法:
// testAjax.aspx
<%
Response.Charset("GB2312");
Response.Write('This is a test for mootools.Ajax,中文信息没有乱码');
%>
具体语法不记得了,以前稍稍学过asp.net,但是没有用来应用,网上有很多这方面的帖子。
re: HTML-加速、再加速 PeakGao 2007-04-05 11:52
@梦在天涯
搞游戏开发搞了6年,NND,可是没有作总结,博客开的也迟,比较懒,最近在学php,想在互联网方面拓展一下知识,呵呵,现在稍稍勤奋了点,给自己加颗星,:)
re: 对list的查找的另一种作法 PeakGao 2006-06-11 21:06
@LOGOS
是的,iterator会随着节点的增删而导致prev,next节点地址无效,你不要去真正记录iterator的地址,记录节点地址就可以了