【发布时间】:2011-12-16 19:19:14
【问题描述】:
我正在寻找一个支持频繁添加/删除的容器。我不知道容器可能会增长到多大,但我不想因为巨大的重新分配而陷入困境。我需要在性能和一致的行为之间取得良好的平衡。
最初,我考虑了 std::tr1::unordered_map,但由于我不知道数据集的上限,因此碰撞确实会降低 unordered_map 的性能。这不是一个好的散列函数的问题,因为无论它有多好,如果地图的占用率超过桶数的一半,冲突可能会成为问题。
现在我正在考虑使用 std::map,因为它没有冲突问题,但它只有 log(n) 性能。
当您不知道 unordered_map 的目标大小时,有没有办法智能地处理冲突?处理这种情况的任何其他想法,我想这并不少见?
谢谢
【问题讨论】:
-
正确的答案当然是通过将容器的选择隐藏在一个类中来抽象它。然后,您可以使用不同的容器轻松地分析您的实际应用程序。也就是说......我敢打赌
std::unordered_map会比你想象的更好。 -
我假设你想要一个关联容器?
-
您可能会对 std::vector 的性能感到惊讶。在您有一些非常具体的要求之前,这是一个非常不错的选择。
-
@BoPersson:别忘了推荐
std::deque,它比vector 更适合移除/插入。 (嗯,现在我很想在一对双端队列周围制作一个类似地图的包装器) -
这个问题缺少太多信息,无法给出任何有用的答案。
标签: c++ performance