使用映射检查id是否存在

时间:2016-07-29 08:00:03

标签: c++ dictionary lookup-tables

我正在实施锁定机制,为此,我需要快速查找,并且已经锁定了给定的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,它会被压缩为位。现在我想知道我是否浪费了很多记忆来维持那些bool,而我甚至还不需要它们。 char会更好还是其他一些只能在没有额外数据的情况下进行密钥查找的结构?

2 个答案:

答案 0 :(得分:3)

如果您有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,但我想您的代码读者很难理解映射值的用途。

P.S。:并记住Rules Of Optimization;)

答案 1 :(得分:1)

您可以在以下条件下使用std::vector<bool>boost::dynamic_bitset

  1. IdType是一个整体类型

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

    < / LI>
  3. 您不必迭代集合中的元素(只需插入/删除/检查存在),或者不经常进行迭代,性能强调是插入/删除/包含测试操作。

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

相关问题