C ++的矢量或地图或哈希地图?

时间:2012-09-05 00:59:14

标签: c++ map vector hashmap

我有大量的记录,比如大约4,000,000,我想反复解决它们并将信息放在与该记录相关联的类中。我不确定应该使用哪种数据结构?我应该使用矢量,地图还是哈希地图。我不需要插入记录,但我需要读取一个包含这些记录编号(或名称)集合的表,然后获取一些链接到该记录的数据并对它们执行一些处理。地图上的发现是否足够快,不能用于此示例的哈希图?记录有一个类作为其结构,在使用具有类作为其值的map或hashmap之前我没有做过任何事情(如果可能的话)。 先谢谢你们。

编辑:

我现在不需要同时拥有内存中的所有记录>我需要先给它一个结构,然后从一些记录中获取数据。记录总数大约是2000万,我想读取每个原始记录,然后如果我的新地图或向量中不存在我想要创建的基本信息,并将其余数据放在那里作为一个向量。因为我有2000万条记录,所以我认为每条记录都会通过400万条记录来查找该记录的基本信息是否存在,这将是非常令人难以忍受的。我有大约400万种类型的包,每个包都可以有多种服务类型(每包约5(20/4))。我想读取每个记录,然后如果包ID不存在于向量中或我想要使用的任何内容中,并将基本信息推送到向量中,然后将与该包相关的服务保存在向量中在包类中。

1 个答案:

答案 0 :(得分:5)

这三种数据结构各有不同的目的。

vector基本上是一个动态数组,适用于索引值。

map是一个排序数据结构,具有O(log(n))检索和插入时间(使用平衡二叉树实现,通常为红黑)。如果找不到有效的哈希方法,这是最好的。

hash_map使用哈希来检索对象。如果你有一个具有低冲突率的明确定义的散列函数,你将获得平均的持续检索和插入时间hash_map通常比map快,但并非总是如此。它高度依赖于散列函数。

对于您的示例,我认为最好使用hash_map,其中密钥将是记录编号(假设记录编号是唯一的)。

如果这些记录号密集(意味着索引之间几乎没有间隙 ,说:1,2,4,5,8,9,10 ......),你可以使用vector。如果您的记录来自具有自动增量主键且没有多少删除的数据库,则通常应该这样。