我想保留一个对象列表,以便我可以迭代它们并通过遍历每个事件来通知它们每个事件。我不关心他们收到通知的顺序,我只需要尽可能快地对这些对象进行迭代和方法调用。
此类功能的最有效(C ++标准库)数据结构是什么?
答案 0 :(得分:7)
每当你发现自己问的问题是“哪种方式更快,X或Y?”或“什么是最快的X?”时,只有一个真正的答案:
对其进行基准测试。
如果您处于不确定并且必须选择一个的阶段,除非测量另有规定,否则这是一条经验法则:
std::array
或普通C数组。std::array
或普通C数组。std::vector
。请注意,如果您在运行时找到所需的大小,则可以使用std::vector::reserve
来减少所需的内存分配数量,从而提高性能。当然,你只是为了确定它来衡量它;)
另请注意,“高效”可能意味着不同的内容,具体取决于您的域名。例如,使用较少的RAM可能对某些人来说更好,即使以CPU周期为代价。
答案 1 :(得分:1)
高效迭代对cache misses很敏感。这意味着您可以做的最好的事情(在一般情况下,排除多线程/ false cache sharing问题)是将您的项目保持在连续的内存区域,并按内存顺序迭代它们。连续内存由c-array std::array
和std::vector
提供。
现在,关于调用每个项目的方法。如果将项目存储为(任何)指针意味着项目本身位于RAM中的其他位置,可能是动态分配的,因此可能非常分散在内存中。因此,在每个项目上调用方法可能涉及缓存未命中,这可能非常昂贵。因此,值得考虑按值存储您的商品。
是的,像往常一样,除了你的探查者之外,不要相信我
答案 2 :(得分:0)
如果它是固定大小或具有有限的最大大小,则可以使用C阵列。
如果您需要动态方法,可以使用std::vector
或std::list
。
我并不确切知道std::vector
是如何实现的,但据我所知,std::list
被实现为双链表,因此在O(1)时间内执行迭代到下一个元素导致在O(n)时间内完全迭代。