我不确定在这里使用最好的C ++数据容器....我正在构建一个对延迟非常敏感的应用程序(所以我需要绝对最快的实现)。
我需要一次性存储大约300,000个字符串(只有一次写入),然后频繁检查该数据存储中是否存在元素(多次读取)。我永远不需要对此数据集做任何其他事情,除非检查其中是否存在值,并且我需要每秒检查数百次。如果重要,查找的大多数将导致找不到密钥。
我考虑过使用矢量或数组,但它们似乎都只是扫描整个列表并一对一地检查值...哪个会起作用......但是因为我们正在索引字符串,所以没有任何数据容器可以为值构建某种树索引,因此在搜索值“apple”时,它首先会查看以“a”开头的键,然后是下一个字符“p”,以及它没有找到任何“ap ...”它立即返回未找到。对我来说,这似乎比每次搜索整个大型集更快。我真的希望原生容器具有这种功能。
如果有帮助的话,这个项目确实编译了Boost。
非常感谢!
答案 0 :(得分:2)
使用Boost,答案显然是boost::unordered_set
。
它也作为std::unordered_set
中<unordered_set>
的C ++ 11标准的一部分提供。
它们都建立在哈希表上,因此一旦计算出哈希值,就会查找自己的O(1)。
答案 1 :(得分:2)
答案 2 :(得分:0)
这取决于您是否可以将数据保留在内存中,而不是用于此目的的最佳容器是unordered_set。如果您需要检查集合中是否存在某个密钥,则它具有O(1)访问时间。 Boost提供了非常好的实现,您可以在这里找到http://www.boost.org/doc/libs/1_55_0/doc/html/unordered.html。
如果您无法将数据保存在内存中,因为它太大,您可以使用不同的技巧。你可以计算每个字符串的一些小散列(你可以找到不同的散列函数),所以它就像从字符串转换一样 - &gt;基本上是int。然后,每当您需要测试数据库中是否存在字符串时,您只需将其转换为int(使用相同的哈希函数)并检查哈希表(如果存在)。如果需要检索数据,可以将哈希值与文件中字符串的偏移量相关联,但在您的情况下,只有在需要节省空间时才能考虑保留哈希值。
PS。 unordered_set也使用哈希函数,它只是隐藏。