c ++标准库中是否有这样的结构?我无法访问其他任何内容,因此tr1中的unordered_map无法使用(和boost等)。
我所拥有的是100000+的大量自定义类元素,我需要存储它们,并且在everage上非常快速地访问它们O(1)。我不能使用数组/向量,因为元素将随机存储,我不知道元素的位置。
我唯一的替代方法是实现一个只有c ++标准库可用的自己的hashmap实现吗?
答案 0 :(得分:6)
如果您真的被限制在std::
并且无法使用其他任何内容, std::map
是您最好的选择。这只给你对数查找时间,而不是常数查找时间,但与数组/向量相比,它将非常快。另外我想只有100000个元素,对数查找将足够快,你不会通过使用哈希表获得太多。
话虽如此,很可能你的实现已经包含了一些哈希表实现。因此,如果std::map
真的不够快,请尝试
#include <tr1/unordered_map>
std::tr1::unordered_map<int,int> test;
或
#include <hash_map>
stdext::hash_map<int,int> test;
甚至
#include <boost/tr1/unordered_map.hpp>
std::tr1::unordered_map<int,int> test;
答案 1 :(得分:5)
问题是O(1)查找不是标准的。我不确定boost有什么,但是一些STL实现(比如sgi)有hash_map。这就是你所需要的。
试试看:
#include <hash_map>
请记住,如果这样做有效,它就不可移植......但也许现在没问题,以后你可以找到解决方法。
答案 2 :(得分:4)
为什么你不能使用Boost? Unordered集合库是“仅标题”,这意味着您不必使用Boost的BJam构建过程和安装程序。您只需抓取.hpp
个文件并将其添加到项目中即可。
答案 3 :(得分:2)
hash_map
是STL的SGI扩展的一部分。在GCC中,您可以通过执行以下操作来使用它;我不知道其他实现:
#include <ext/hash_map>
using __gnu_cxx::hash_map;
hash_map<int,string> foo; // or whatever
unordered_map
是TR1的一部分。在GCC中,您可以通过执行以下操作来使用它;我不知道其他实现:
#include <tr1/unordered_map>
using std::tr1::unordered_map;
unordered_map<int,string> foo; // or whatever
答案 4 :(得分:1)
当前标准中的默认STL没有O(1)查找容器。
答案 5 :(得分:0)
与某些STL中的hash_map
一样,查找unordered_map
(它将在C ++的TR1版本中调用和/或调用)。
答案 6 :(得分:0)
您可以使用unordered_map容器。它在tr1中,将在下一个完整标准中。 Visual Studio在&lt; unordered_map&gt;中实现了它。和文档可以在这里找到:http://msdn.microsoft.com/en-us/library/bb982522.aspx