繁体   English   中英

使用地图检查ID是否存在

[英]Using a map to check if an id exists

我正在实现锁定机制,为此,我需要快速查找是否已锁定给定的ID。 现在我正在考虑使用地图,我想知道是否有更好的结构。 基本上我真的不需要地图,因为没有完成映射。 但是,如果我要使用向量,则必须进行线性搜索,这对于许多条目而言将变得昂贵。

现在,我想知道是否有某种结构可以让我进行类似的快速查找,而又没有存储etra数据的额外开销。

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会更好还是其他一些结构可以在没有额外数据的情况下为我提供键查询呢?

如果您使用C ++ 0x,则可以使用std::unordered_set ,平均查找为O(1)

从cppreference.com文档(重点是我的):

...搜索,插入和删除的平均恒定时间复杂度

在内部,这些元素不是按任何特定顺序排序的,而是按桶进行组织。 元素放入哪个存储桶完全取决于其值的哈希值。 这允许快速访问各个元素 ,因为一旦计算了哈希,它就指向元素所放置的确切存储桶。

如果您没有C ++ 0x,则unordered_set应该位于TR1中

#include <tr1/unordered_set>
std::tr1::unordered_set<IdType> locked;

您也可以使用unordered_map ,但是我想您的代码读者将很难理解映射值的用途。


PS:并牢记优化规则 ;)

您可以在以下情况下使用std::vector<bool>boost::dynamic_bitset

  1. IdType是整数类型

  2. 所有id值都在足够短的范围内。 内存使用量将是(length of that range)/8 ,这可能比包含其中所有元素的std::unordered_set<int>std::set<int>所消耗的内存少几个数量级。范围。

  3. 您不必遍历集合中的元素(只需插入/删除/检查状态),或迭代很少发生,并且性能重点在于插入/删除/保持性测试操作。

在这种情况下,动态位集是一种更合适的数据结构(速度更快,存储效率更高)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM