[英]Java or C++ for my particular agent-based model (ABM)?
遗憾的是,我需要开发一个基于代理的模型。 我的背景是C ++; 我很体面但不是专业的程序员。 我的目标是确定,目前我的背景是,使用C ++或Java编写以下类型的算法是更快还是更容易。
Host
。 他们的私人成员变量包括他们对不同菌株的感染和免疫状态( int
型)。 (在C ++中,我可能会使用unordered_map
或vector
来保存这些信息,具体取决于应变的数量。)我计划跟踪向量中的所有主机, vector< Host *> hosts
。 vector< Host *> immune
和vector< Host *> infectious
(我可能使每个二维,通过菌株索引然后宿主)。 host
杀死并搜索其他结构( immune
和infectious
)以找到指向该对象的所有指针。 我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。 这是真的? 在C ++中有比这更好的方法吗? 在此先感谢您的帮助。
我应该补充说,如果我使用C ++,我将使用智能指针。 也就是说,当对象需要时,我仍然没有看到删除指向对象的所有指针的方式。 (当主机死机时,我想从内存中删除它。)
我意识到在Java中需要学习很多东西。 我希望有人能够更多地了解语言之间的差异,以及谁能理解我需要做什么(上图),可以告诉我一种语言是否显然比另一种语言更有效。
我不能回答你的所有问题,但是
我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。
在Java中,您不会删除对象; 相反,当它的引用计数变为零时,它会被有效删除。 但是,您可能希望在此处使用弱引用 ; 这样,当强引用计数变为零时,对象就会消失。
我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。 这是真的?
不。 你实际上倒退了; 如果删除所有指针,Java将删除基础对象。 所以你仍然需要搜索所有三个数据结构( hosts
, immune
和infectious
)来杀死那个特定的主机。
但是,如果使用正确的数据结构,这种“搜索”将是快速而简单的; HashSet
可以很好地完成这项工作。
private HashSet<Host> hosts;
private HashSet<Host> immune;
private HashSet<Host> infectious;
public void killHost(Host deadManWalking) {
hosts.remove(deadManWalking);
immune.remove(deadManWalking);
infectious.remove(deadManWalking);
}
它真的很简单,并且会在O(lg n)时间内发生。 (虽然您必须在Host
的实现中覆盖equals
和hashCode
方法;这在技术上并不具有挑战性。)
我对C ++的记忆对我来说太朦胧了,无法对这两种语言进行任何权威的比较。 我在大学里做了大量的C ++工作,从那时起就没有碰过它。 C ++代码会运行得更快吗? 做得对,并假设你没有任何内存泄漏,我怀疑它会,虽然Java的代表作为一种缓慢的语言主要是从它的年轻人的保留; 这些天很不错。 更容易写? 好吧,假设你正在学习这门语言,可能不是。 但是从C ++到Java的学习曲线非常温和,我个人根本不会错过C ++。 一旦你了解了这些语言,在我看来,Java就更容易使用了。 YMMV,natch,但它可能值得为你付出努力。
实际上,你的印象基本上是倒退的:当没有任何指针可以访问该对象时,Java会假定一个对象(在这种情况下是主机)已经死了。 此时它将自动清理对象。
然而,在猜测中,有一个“拥有”主机的集合,并且负责在主机死亡时删除它。 其他指向主机的指针不拥有它。 如果是这种情况,那么在C ++中,您通常会通过让“拥有”集合包含一个到主机的shared_ptr
来处理它,而其他集合包含对主机的weak_ptr
。 要通过weak_ptr
使用该对象,您必须先将其转换为shared_ptr
,您可以取消引用它以获取主机本身。 但是,如果该对象已被删除,则将weak_ptr
转换为shared_ptr
的尝试将失败,并且您将知道主机已死(然后您可以删除对它的引用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.