【发布时间】:2016-07-29 08:00:02
【问题描述】:
我正在实施一种锁定机制,为此我需要快速查找给定 ID 是否已被锁定。现在我正在考虑使用地图,我想知道是否有更好的结构。基本上我真的不需要地图,因为没有完成映射。但是,如果我要使用向量,我将不得不进行线性搜索,这对于许多条目来说会变得很昂贵。
现在我想知道是否有某种结构可以让我进行类似的快速查找,而无需存储 etra 数据的额外开销。
i.E.
std::map<IdType, bool> locked;
// Prevent deadlock by checking if this thread already locked. Otherwise
// it can pass through.
if(locked.find(Id) != locked.end())
lock();
如您所见,我并不真正需要映射值。我知道对于std::vector,使用bool,它被压缩为比特。现在我想知道我是否浪费了大量内存来维护这些布尔值,而我什至不需要它们。 char 会更好还是其他一些结构可以让我在没有额外数据的情况下进行密钥查找?
【问题讨论】:
-
如果不需要关联性,使用
set怎么样?在这之间,您也应该使用vector对其进行分析。如果您的线性搜索性能优于set::find,请不要感到惊讶 -
这应该在一些内存受限的硬件上运行吗?如果要在 PC 上运行,请不要费心优化几个字节,您的检查中也存在竞争条件
-
@slawekwin safaribooksonline.com/library/view/c-coding-standards/… 这适用于这里:编写 std::set 而不是 std::map 可以更好地以程序员零成本捕获代码的意图,而不会让未来的程序员想知道什么是未使用的值可能用于。
-
@Arunmu,我曾经分析过这样一个案例,发现对于低于 10 左右的项目数,向量更快。但是,我需要数百个 ID,所以我知道一棵树更快。我猜
set是我要找的。谢谢! -
@H.Guijt 我并不是说 map 是这里的最佳选择,我是说过早和微优化不是一件好事。然而,我确实同意可读和可理解的代码是对使用的结构三思而后行的好理由,尽管这个问题与此无关。
标签: c++ dictionary lookup-tables