您是否可以分享您对存储大量名称并对这些名称进行搜索的最佳STL数据结构的看法?
编辑: 名称不是唯一的,列表可以随着新名称的不断添加而增长。总的来说,我说的是100万到1000万个名字。
答案 0 :(得分:4)
由于您要搜索名称,因此您需要一种支持快速随机访问的结构。这意味着矢量,双端队列和列表都是不可能的。此外,矢量/数组在有序集的随机添加/插入时很慢,因为它们必须移动项目以为每个插入的项目腾出空间。但是,添加到结尾非常快。
如果您只存储密钥,请考虑std::map
,std::unordered_map
或std::unordered_multimap
(或其兄弟std::set
,std::unordered_set
和std::unordered_multiset
。
如果你纯粹打算进行独特的随机访问,我会从其中一个unordered_ *容器开始。
如果您需要存储有序的名称列表,并且需要进行范围搜索/迭代和排序操作,那么基于树的容器(如std::map
或std::set
)应该比迭代操作做得更好基于散列的容器,因为前者将存储与其逻辑前导和后继相邻的项。对于随机访问,它仍然是O(log N)。
在std :: unordered_ *之前,我使用std::map
来保存对象缓存的大量对象,虽然有更快的随机访问容器,但它的扩展性足以满足我们的需求。较新的unordered_map具有O(1)访问时间,因此它是一个散列结构,可以为您提供接近最佳的访问时间。
答案 1 :(得分:0)
您可以考虑使用分隔符来连接这些名称的可能性,但搜索可能会受到影响。您需要提出调整后的二进制搜索。
但是你应该首先尝试一个明显的解决方案,它是一个在stl中称为unordered_map的hashmap。看看它是否符合您的需求。搜索应该在那里很快,但代价是内存。