最有效的C ++数据结构,在订单无关紧要时进行迭代?

时间:2018-02-09 13:44:31

标签: c++ list data-structures

我想保留一个对象列表,以便我可以迭代它们并通过遍历每个事件来通知它们每个事件。我不关心他们收到通知的顺序,我只需要尽可能快地对这些对象进行迭代和方法调用。

此类功能的最有效(C ++标准库)数据结构是什么?

3 个答案:

答案 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::arraystd::vector提供。

现在,关于调用每个项目的方法。如果将项目存储为(任何)指针意味着项目本身位于RAM中的其他位置,可能是动态分配的,因此可能非常分散在内存中。因此,在每个项目上调用方法可能涉及缓存未命中,这可能非常昂贵。因此,值得考虑按值存储您的商品。

是的,像往常一样,除了你的探查者之外,不要相信我

答案 2 :(得分:0)

如果它是固定大小或具有有限的最大大小,则可以使用C阵列。

如果您需要动态方法,可以使用std::vectorstd::list

我并不确切知道std::vector是如何实现的,但据我所知,std::list被实现为双链表,因此在O(1)时间内执行迭代到下一个元素导致在O(n)时间内完全迭代。