我有一个用C++编写的模拟,在这个模拟中我需要维护一个可变数量的代理,而且我在决定如何很好地实现它时遇到了困难。每个特工看起来都类似于:
class Agent{
public:
Vector2f pos;
float health;
float data[DATASIZE];
vector<Rule> rules;
}我需要在我的模拟中保持一个可变数量的代理,以便:
最好,代理的数量没有上限--我可以轻松地添加一个代理-- agents.
G 214/code>代理应该使用什么样的容器或设计原则?直到现在,我还在使用向量,但我认为很难从这个结构中抹去:我需要经常做的事情,因为事情一直在消失。有什么可供选择的吗?我想到了一些类似List的东西,但我不认为它们可以并行化,因为它们是作为带有迭代器对象的链接列表实现的?
谢谢
发布于 2010-08-30 19:50:55
直到现在,我还在使用向量,但是我认为很难从这个结构中抹去:我需要经常做的事情,因为事情总是在消失。
在模拟的每一步中,你预计会有多少人死亡?对于一个人来说,“无时无刻不在”对计算机来说仍然是非常罕见的。例如,如果模拟的每一步处理数千个代理,但平均每几个步骤只有一个代理死亡,那么代理死亡是一个小事件。有了这些数字,您的程序处理活代理的时间要远远超过处理死代理的时间,因此担心删除死代理的性能可能根本不值得。如果使代理去除效率更高最终会导致正常代理迭代和处理效率降低(而代理去除相对较少),那么这可能是一个糟糕的权衡。
另一方面,如果每个模拟步骤都有大量代理生成并死亡,那么您可能希望确保这些事件能够得到有效的处理。所以这真的取决于你想要处理的数字类型。
我的一般建议是继续使用std::vector (只要它适合您设计的其余部分),除非您真的期望每一步与代理总数相比会有相当多的代理死亡。
发布于 2010-08-30 19:25:16
当你死后,你可以把特工留在名单上,准备重新使用。不要担心容器的收缩,并且保留向量的好处。您可以保留一个指向死/可重用代理的单独的指针堆栈,当一个代理死亡时,只需按下它,就可以弹出一个来重新获得一个新的代理。
foreach Agent {
if (agent.health > 0) // skip dead agents
process rules发布于 2010-08-30 19:31:29
列表应该很好。它可以并行化,因为插入或删除元素不会使其他迭代器失效(当然,指向被移除的元素的迭代器除外)。
如果不需要向后遍历,slist与list一样好,而且速度更快一些。
如果您不关心元素的顺序,请使用set。
https://stackoverflow.com/questions/3603465
复制相似问题