注意:不幸的是,我没有时间继续开发此哈希图。我有一个值得的继任者,请前往:
ankerl::unordered_dense::{map, set}
我花了很多时间来开发和改进
robin_hood,并且在大多数用例中都可以很好地工作。除非它们是关键错误修复的PR,否则我将不再对此代码进行任何更新。
robin_hood::unordered_map and robin_hood::unordered_set是一个平台独立替换std::unordered_map / std::unordered_set ,它既快速又更有效地记忆,用于现实世界中使用情况。
robin_hood.h添加到您的C ++项目中。robin_hood::unordered_map而不是std::unordered_maprobin_hood::unordered_set代替std::unordered_setCMakeLists.txt (请参阅有关如何使用MSBUILD,MESON等)的文档: project (myproject CXX)
add_executable ( ${PROJECT_NAME} main.cpp)
include ( ${CMAKE_BINARY_DIR} /conanbuildinfo.cmake) # Include Conan-generated file
conan_basic_setup(TARGETS) # Introduce Conan-generated targets
target_link_libraries ( ${PROJECT_NAME} CONAN_PKG::robin-hood-hashing)conanfile.txt (别忘了更新版本) [requires]
robin-hood-hashing/3.11.5
[generators]
cmakepip install conan
mkdir build
cd build
conan install ../ --build=missing
cmake ../
cmake --build .robin-hood-hashing包装在柯南(Conan)中保持最新状态。如果该版本已过时,请在conan-center-index存储库上创建问题或提取请求。 请在Hashmaps基准测试中查看广泛的基准测试。简而言之: robin_hood始终是最快的地图之一,并且使用的内存要比std::unordered_map少得多。
两个内存布局。数据要么存储在平面阵列中,要么在节点间接方面。由于没有间接, unordered_flat_map的访问非常快,但是对元素的引用不稳定。它还会导致地图大小时会导致分配尖峰,并且需要大量的大对象内存。基于节点的映射具有稳定的引用和指针(不是迭代器!类似于std :: unordered_map),并在配对中使用const Key 。由于间接,这要慢一些。选择是你的;您可以直接使用robin_hood::unordered_flat_map或robin_hood::unordered_node_map 。如果您使用robin_hood::unordered_map则尝试选择适合您数据的布局。
自定义分配器。基于节点的表示形式具有自定义的散装分配器,该分配器试图进行很少的内存分配。所有分配的内存都重复使用,因此不会有任何分配峰值。也很快。
优化的哈希。 robin_hood::hash具有针对整数类型和std::string的自定义实现,这些实现非常快,可以回到std::hash for其他所有内容。
取决于良好的哈希。对于非常糟糕的哈希,性能不仅会像std::unordered_map中的降级,而且地图将仅使用std::overflow_error失败。在实践中,使用标准robin_hood::hash时,我从未见过这种情况。
根据MIT许可获得许可。有关详细信息,请参见许可证文件。
由马丁努斯