unordered_map它是如何工作的/优化设计
unordered_map how it works/optimizing the design?
我在另一个论坛上阅读了以下帖子,该帖子来自一个似乎对C++内部结构了解很多关于在"字典"中插入数千个键的人:
e) 地图和设置查找是用红黑或平衡树和每个项目都是"单独"分配的,因此如果您要分配 500,000带有指向仪器的指针的仪器 [按符号] 对象类关联,您有"N"个字节 [加上开销]指针的字符串和 4 个字节 [加上开销]。并包括;一分钟、五秒、一秒的价格时间序列STD中所有这些工具的工具和完整的交易历史器皿。这是很多内存和更多的浪费到小对象分配开销!
f) 臭名昭著的是,STD Map & Set 使用下限 Begin 遍历所有键以查找 [收起比比较],这是慢得像地狱。
g) 一些天才可能会说:"不,他们使用未排序的地图"...好吧,他们没有,但即使他们这样做了,他们仍然对离散分配的元素执行字符串比较。
我在C++中所做的如下(示例);
a) 创建一个"自定义"就地字符串类对象,它有两个个性;a) 一个字节数组,和 b) 一个整数数组 [模数 4并在本机边界上对齐]。b) 使用自定义地图和设置,它基于哈希的 2x 维度,节点分配在平面中连续内存区域[可以动态调整大小]。c)字符串 [整数格式] 哈希由整数完成,以管道CPU 和密钥比较以类似的方式完成。
使用这些技术,只能在C++,C或ASM中完成至少是相同性能的 4-5 个数量级在.NET,C#或Java中完成的事情。
http://www.elitetrader.com/vb/showthread.php?s=1eb70fb998d8a51d22050ea53d24db21&threadid=204368&perpage=6&pagenumber=3
如果我大致知道我将插入多少个密钥,那么我可以使用哪些技术来设计自己的unordered_map实现,该实现比针对我的特定用途的标准实现更有效?
(任何关于设计哈希函数的 101 都是非常欢迎的)
要使用unordered_map
你只需要为你的密钥设计一个哈希函数。C++标准库为内置密钥类型提供了一组哈希函数,例如:hash<int>
或hash<float>
。如果你对一个unordered_map<int,int>
进行解冻,默认情况下它会使用 hash<int>
作为哈希函数。但是如果你想使用自己的对象作为键,你必须提供自己的哈希函数。
优势:尽管unordered_map<T>
中的插入时间较大,但在从容器中检索(key,value)
对时,哈希通常会提供O(1)
的复杂性。
- QSqlquery prepare()和bindvalue()不工作
- 空基优化子对象的地址
- 导入库可以跨dll版本工作吗
- 关闭||运算符优化
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- Visual Studio 调试优化如何工作?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- O2优化水平中断程序工作
- 找不到使保证返回值优化工作的方法
- c++O3优化在循环时中断工作
- unordered_map它是如何工作的/优化设计
- c++ while循环优化不能正常工作
- g++内联asm在使用优化标志时未按预期工作