【问题标题】:How to find the size of the hash table?如何找到哈希表的大小?
【发布时间】:2011-04-03 11:44:06
【问题描述】:

我有一个这样定义的哈希表

typedef std::unordered_map<unsigned long long int,unsigned long long int> table_map;

在程序中,我使用 fread 将文件的内容读入缓冲区,如下所示:

fread(buffer, sizeof(long long int), 1024, file1);

我将哈希表声明为

table_map c1;

现在我创建一个类似的哈希表

for (i = 0; i < 1024; i++)
    c1.insert(table_map::value_type(buffer[i], i));

现在我的问题是,在 for 循环之后如何获取哈希表的大小?

它有 1024 个 unsigned long long int 类型的元素以及相同类型的键,但我不能使用 sizeof(Mymap) 或 `size of(c1) 因为它只返回值 32。有什么办法可以找到吗?

谢谢, 苏尼尔

【问题讨论】:

    标签: c++ hash hashtable


    【解决方案1】:

    将容器的 size 属性乘以对的大小:

    std::cout << c1.size() * sizeof(table_map::value_type) << "\n";
    

    在我的系统上,打印出来的是:

    16384

    这并不完全准确,因为簿记数据没有被考虑在内。您无法解释它,因为(据我所知)该标准对该实现细节没有任何保证。

    如果您检查存储桶数据,您可能会得到更好的数据。 ::bucket, :: bucket_count, ::bucket_size。不过,这可能只会为您提供有关键、值和对的数据。我没试过。

    【讨论】:

      【解决方案2】:

      所有标准库容器都有一个size() 成员函数,它返回容器中元素的数量。

      您可以直接拨打c1.size()

      【讨论】:

      • 完美运行。但是我如何将它与总大小联系起来?我的意思是哈希表的大小包括元素的数量(在我的情况下,每个元素都是 unsigned long long int)和键的大小(也是 unsigned long long int)对吗?
      • @Sunil:如果你想要以字节为单位的大小,那么就没有可移植的方式来获取该信息。
      • Sunil:如果您使用自定义分配器,您的运气会更好吗?分配器似乎仅用于对,而不用于动态分配的簿记数据。不过,这似乎打破了 一些 场景,而这些场景本来可以使用自定义分配器来处理。
      • @merlyn Morgan-Graham:哈希表的自定义分配器?我使用了像向量这样的自定义分配器而不是数组,但是我没有使用任何关于哈希表的东西,因为我是 C++ 新手。您能否对此进行更多说明或分享任何链接,以便我可以了解您的建议?谢谢。
      • @Sunil:要获取其内容的大小(以字节为单位),请乘以 c1.size() * sizeof( table_map::value_type )。但是,这并不代表总的内存开销。
      猜你喜欢
      • 2014-05-09
      • 2019-01-17
      • 2017-08-07
      • 2011-08-27
      • 2015-06-14
      • 2013-03-29
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多