如何查找哈希表的大小?

3

我有一个哈希表,定义如下:

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。有没有办法找到它?
谢谢, Sunil
2个回答

4

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

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

在我的系统上,这将打印出:
16384
这并不完全准确,因为会计数据未被考虑在内。您无法计算它,因为(据我所知)标准没有关于该实现细节的任何保证。
如果您检查桶数据,则可能会获得稍微更好的数据。::bucket、::bucket_count、::bucket_size。但这可能只给您关于键、值和对的数据。我还没有尝试过。

3

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

您只需调用 c1.size() 即可。


运行完美。但是我如何将它与总大小相关联呢?我的意思是哈希表的大小包括元素数量(在我的情况下,每个元素都是无符号长长整型)和键的大小(也是无符号长长整型),对吗? - 0x0
@Sunil:如果您想获取以字节为单位的大小,则没有可移植的方法来获取该信息。 - James McNellis
Sunil:如果您使用自定义分配器,是否会有更好的运气?似乎分配器仅适用于成对数据,而不适用于动态分配的簿记数据。这似乎会破坏某些场景,尽管可以使用自定义分配器处理这些场景。 - Merlyn Morgan-Graham
@ merlyn Morgan-Graham:为哈希表编写自定义分配器?我已经使用类似于向量而不是数组的自定义分配器,但由于我是C++新手,所以我没有使用过与哈希表有关的任何东西。您能否详细说明一下或者分享任何链接,让我了解您建议的内容?谢谢。 - 0x0
@Sunil:要获取其内容的字节大小,请将 c1.size() * sizeof(table_map::value_type) 相乘。但是,这并不代表总内存开销。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接