c++ 为什么hashmap占用内存多

如题所述

c++ 中hashmap占用内存多的原因是基础类型太少,对象用的太多导致的。
解决方法:
1、导入stl中的hash_map类库
#include <hash_map>
using namespace std;
using namespace stdext;
2、hash_map是一个聚合类
它继承自_Hash类,包括一个vector,一个list和一个pair,其中vector用于保存桶,list用于进行冲突处理,pair用于保存key->value结构,简要地伪码如下:
class hash_map<class _Tkey, class _Tval>
{
private:
typedef pair<_Tkey, _Tval> hash_pair;
typedef list<hash_pair> hash_list;
typedef vector<hash_list> hash_table;
};
3、用法举例:
hash_map<int, int> IntHash;
IntHash[1] = 123;
IntHash[2] = 456;
int val = IntHash[1];
int val = IntHash[2];
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-05-25
当然,这只是一个简单模型,C++标准库的泛型模版一向以嵌套复杂而闻名,初学时看类库,无疑天书啊。微软的hash_map类还聚合了hash_compare仿函数类,hash_compare类里又聚合了less仿函数类,乱七八糟的。
下面说说使用方法:
一、简单变量作为索引:整形、实性、指针型
其实指针型也就是整形,算法一样。但是hash_map会对char*, const char*, wchar_t*, const wchar_t*做特殊处理。
这种情况最简单,下面代码是整形示例:

[cpp] view plaincopy
hash_map<int, int> IntHash;
IntHash[1] = 123;
IntHash[2] = 456;
int val = IntHash[1];
int val = IntHash[2];

实型和指针型用法和整形一样,原理如下:
1、使用简单类型作索引声明hash_map的时候,不需要声明模版的后两个参数(最后一个参数指名hash_map节点的存储方式,默认为pair,我觉得这就挺好,没必要修改),使用默认值就好。
2、对于除过字符串的其它简单类型,hash_map使用模版函数 size_t hash_value(const _Kty& _Keyval) 计算hash值,计算方法是经典的掩码异或法,自动溢出得到索引hash值。微软的工程师也许开了一个玩笑,这个掩码被定义为0xdeadbeef(死牛肉,抑或是某个程序员的外号)。
3、对于字符串指针作索引的时候,使用定类型函数inline size_t hash_value(const char *_Str)或inline size_t hash_value(const wchar_t *_Str)计算hash值,计算方法是取出每一个字符求和,自动溢出得到hash值。对于字符串型的hash索引,要注意需要自定义less仿函数。
因为我们有理由认为,人们使用hash表进行快速查找的预期成本要比在hash表中插入的预期成本低得多,所以插入可以比查找昂贵些;基于这个假设,hash_map在有冲突时,插入链表是进行排序插入的,这样在进行查询冲突解决的时候就能够更快捷的找到需要的索引。
但是,基于泛型编程的原则,hash_map也有理由认为每一种类型都支持使用"<"来判别两个类型值的大小,这种设计恰好让字符串类型无所适从,众所周知,两个字符串指针的大小并不代表字符串值的大小
附上出处链接:http://blog.csdn.net/srzhz/article/details/7881946/本回答被提问者采纳
第2个回答  推荐于2017-09-25
get方法是弱一致的,是什么含义?可能你期望往ConcurrentHashMap底层数据结构中加入一个元素后,立马能对get可见,但ConcurrentHashMap并不能如你所愿。换句话说,put操作将一个元素加入到底层数据结构后,get可能在某段时间内还看不到这个元素,若不考虑内存模型,单从代码逻辑上来看,却是应该可以看得到的。
第3个回答  2016-05-26
用hashmap>作为数据结构,然后,添加删除什么的就在hashmap里面的hashset加一个A比如说
第4个回答  2017-10-04
当然,这只是一个简单模型,C++标准库的泛型模版一向以嵌套复杂而闻名,初学时看类库,无疑天书啊。微软的hash_map类还聚合了hash_compare仿函数类,hash_compare类里又聚合了less仿函数类,乱七八糟的。

c++ 为什么hashmap占用内存多
c++ 中hashmap占用内存多的原因是基础类型太少,对象用的太多导致的。解决方法:1、导入stl中的hash_map类库 include <hash_map> using namespace std;using namespace stdext;2、hash_map是一个聚合类 它继承自_Hash类,包括一个vector,一个list和一个pair,其中vector用于保存桶,list用于进行冲突...

C++ hashmap 写入文件
弄了好久也没搞定,后来才知道像map,vector,hasp_map这样动态的存储结构是无法将其对象写入文件的。只能存数据。像楼上说的用CArchive类,我觉得应该行不能,毕竟CArchive只能写CObject对象!在网上找了个写map入文件的实现,它也不是直接写对象,而是写数据。读的时候再根据数据构造对象内容。对于hash_...

c++算法,关于出现频率最大的数的问题
如果使用hashmap,则复杂度应该是o(n+n*logm+m),m为字符串的种数,m<=n。理解为对遍历数组O(n)+对hashmap的检索和对象添加O(n*logm)+对hashmap进行遍历查找最大值。以下方法可以做一点点优化。复杂度应该是o(n+n*logn),即一次遍历和一次快速排序 1、将原字符串数组排序(让同一字符串排...

求高手用c++解决二十四点的问题,具体如下
主要是因为好久没用,把java的HashMap给忘了。这个数据结构用在这里正合适,也就是说不用两个HashSet加两个ArrayList解决了,直接存在一个HashMap里面就可以。 具体的做法是:把计算结果存在map的key中,而表达式存在map的value中,问题彻底解决。map中key的查找效率是很高的,同时插入也很快;当找到一个计算结果为24的时...

folly::ConcurrentHashMap的内存回收方式
Facebook开源的C++库folly中的ConcurrentHashMap内存回收机制依赖于hazard pointers技术。在并发环境下,folly确保即使节点从链表中移除,只要可能有其他线程仍能访问,内存不会立即释放,以防止数据竞争。关键策略是,节点的内存回收会在其前驱节点被回收之后进行,确保线程安全的遍历。folly通过Atom count_标识...

帮忙写个函数,c语言的不要c++。
第二种就是你用链表来二分查找.二分查找key(就是b0a1),将key对应的value(即HZ12_b0a1 地址)对应出来.查找速度N*log(N).第三种我也不会,建议你不要用了,就是做一个hash映射将key(b0a1)对应的byte映射到一组新的地址中去,而这个地址中存着value值.这个方法就是java中的hashmap类方法,但是C...

Java JSP如何取得HashMap的大小
Java里面没有提供像C,C++那样的Sizeof()方法,所以不可以直接取得内存资源大小.但是有提供Runtime.getRuntime ().totalMemory ()和Runtime.getRuntime ().freeMemory ()这样的方法 所以内存使用大小 = totalMemory () - freeMemory();但是又不能直接传送Hashmap对象去计算.必须在创建Haspmap之前gc...

深入理解完美哈希
PerfectHashMap作为实例,它在内存占用和查询速度上表现出色,特别适合于大地图应用。C\/C++的后台开发课程中,学习如何在实际项目中巧妙运用完美哈希,是提升效率的关键。通过实际测试,如MacBook Pro m1 Pro的性能对比,完美哈希技术在海量数据处理中占据一席之地。总结,完美哈希是一场技术和效率的较量,它...

Java为什么比C++慢?以及如何提高Java效率
3、 4、c++的内存占用如何?tr1自带的hashmap(int,int),一个占用16字节,是实际数据的2倍;stl自带的map(int,int),一个占用32字节,是实际数据的4倍;自己写的话,常见的是1.2倍左右的空间占用。 5、为什么java版本的底层结构效率不佳?a)java没有数组转对象的功能b)java对象内存位置是自动...

C++和JAVA得区别?
一、主体不同 1、C++:是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计。2、JAVA:是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念。二、特点不同 1、C++:不仅拥有计算机高效运行的实用性...

相似回答