我有以下要求:
我需要一个带有键值对的数据结构(如果有帮助,键是整数)。
我需要以下操作:-
- 迭代(最常用)
- 插入(第二常用)
- 按键查找和删除(最少)
我计划在结构上使用多个锁来进行并发访问。理想的数据结构是什么?
地图还是无序地图?
我认为无序映射是有道理的,因为我可以在 O(1) 中插入,在 O(1) 中删除。但我不确定迭代。与地图相比,性能有多差?
另外,我计划在块上使用多个锁而不是整个结构。有什么好的实现例子吗?
谢谢
我有以下要求:
我需要一个带有键值对的数据结构(如果有帮助,键是整数)。
我需要以下操作:-
我计划在结构上使用多个锁来进行并发访问。理想的数据结构是什么?
地图还是无序地图?
我认为无序映射是有道理的,因为我可以在 O(1) 中插入,在 O(1) 中删除。但我不确定迭代。与地图相比,性能有多差?
另外,我计划在块上使用多个锁而不是整个结构。有什么好的实现例子吗?
谢谢
迭代器递增的速度O(1)
适用于两个容器,尽管您可能会从std::unordered_map
.
除了较慢的O(log N)
查找/插入/擦除功能之外std::map
,另一个区别是std::map
提供双向迭代器,而较快的(摊销O(1)
元素访问)std::unordered_map
仅提供前向迭代器。
Anthony Williams的优秀书籍C++ Concurrency in Action: Practical Multithreading提供了一个多线程的代码示例,unordered_map
每个条目都有一个锁。如果你正在做严肃的多线程编码,强烈推荐这本书。
你有没有想过尝试一个std::deque
推理如下:
如果最后两种情况很常见,std::list
则可以使用 a。还可以考虑测试 std::vector`,因为它的缓存效率更高。
unordered_map
由于迭代哈希表中大量未使用的元素,在 an 中的迭代可能会很慢。插入将停止,直到碰撞级别变得无法容忍,此时整个数据结构将需要重新布局。
map
s 的迭代速度相对较快,只是数据元素可能相距甚远。由于这需要重新平衡红黑树,插入可能会很慢。
unordered_maps 的主要用例是用于快速查找 (O1)。法线贴图具有快速查找(O log n)但迭代性能要好得多。
如果你有严格的实时要求,我会推荐 map over unordered_map。std::map 保证了 100% 的性能,但 std::unordered_map 可能会在某些关键的极端情况下进行重新哈希并完全破坏实时性能。一般来说,如果我需要绝对保证最坏情况的性能,我更喜欢红黑树(std::map)而不是哈希表(std::unordered_map)。
迭代在unordered_map
. 它的效率比向量低一点,但在很大程度上不是这样。
与往常一样,您需要针对您的用例进行基准测试,并与其他容器类型进行比较,如果它是您代码的关键部分。
不确定“块而不是整个结构上的多个锁”是什么意思 - 任何容器更新都需要为整个容器锁定......