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

作者&投稿:裔凭 (若有异议请与网页底部的电邮联系)
C++ Map中的数据存储方式是什么?Map和HashMap有什么区别?~

你要先去了解一下HASH算法

相对MAP来说,HASHMAP具有更高的查询速度。
举个简单的例子来说
MAP中储存为顺序储存,也就是一个接着一个的储存
如一个MAP中存储 1 3 4 三个元素
则,MAP中第一个元素为1,第二个为3,第三个为4
如果想从MAP中查找元素4,则必须从开始进行便利,则必须比较三次。

而HASHMAP中,开始储存的时候,就将即将储存的元素用一个自定义函数将他转变后,存到相应位置。
如储存,1 3 4
自定义函数为f(x)= x*x。
则1的储存位置为1,3的储存位置为9,4的储存位置为16
如果查找4的话,只需将将要查找的数字也用自定义函数变换一下,直接到换算后的位置上寻找就好了
这样只要比较一次就好了。如过想查找4,换算后为16,直接用这个数字和HASHMAP中的第16个元素比较,就课得出结果了

何谓“根据size”实现轮询?如果lz的哈希表是经典的“桶式哈希”(就是说每个可用的hashcode的散列对应一个‘桶“。一个桶一般以链表的形式存放一系列数据。数据进行访问时,先计算hash,然后模上桶个数,桶的index就是数据所在的桶的位置,然后在这个桶的链表进行顺序查找实际数据)那么,整个hashmap遍历的方法为:for_each(桶in所有的桶)//遍历所有桶{for_each(元素in桶){//访问元素}}思路很简单,就是如何实现。一般桶是以数组的形式,那么直接for(intindex=0;index<桶size;++index){桶=arrray[index];}如果桶里面的元素是以链表的形式,那么就是遍历链表了。如此二层循环执行完毕,就可以遍历整个map。

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];

当然,这只是一个简单模型,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/

get方法是弱一致的,是什么含义?可能你期望往ConcurrentHashMap底层数据结构中加入一个元素后,立马能对get可见,但ConcurrentHashMap并不能如你所愿。换句话说,put操作将一个元素加入到底层数据结构后,get可能在某段时间内还看不到这个元素,若不考虑内存模型,单从代码逻辑上来看,却是应该可以看得到的。

用hashmap>作为数据结构,然后,添加删除什么的就在hashmap里面的hashset加一个A比如说

当然,这只是一个简单模型,C++标准库的泛型模版一向以嵌套复杂而闻名,初学时看类库,无疑天书啊。微软的hash_map类还聚合了hash_compare仿函数类,hash_compare类里又聚合了less仿函数类,乱七八糟的。


达孜县15561739643: c++ 为什么hashmap占用内存多 -
钊葛肝苏: c++ 中hashmap占用内存多的原因是基础类型太少,对象用的太多导致的.解决方法:1、导入stl中的hash_map类库#include <hash_map> using namespace std; using namespace stdext; 2、hash_map是一个聚合类 它继承自_Hash类,包括一个...

达孜县15561739643: 数据放在HashMap里面大约占用内存多大 -
钊葛肝苏: 两种情况,,1,调用remove 方法清除后消失(数据从HashMap对象中消失)2,该HashMap对象失去引用后(HashMap对象消失,)两种情况HashMap中数据若存在引用则只会从HashMap对象中消失,,但数据仍在内存中

达孜县15561739643: 整型数据为什么占据两个字节的内存?单精度实型为什么占据4个字节的内存?双精度为什么占据8个字节? -
钊葛肝苏: 数据类型所占内存大小取决于实现.Microsoft Visual C++中,int占4字节,float占4字节, double占8字节.换句话说取决于你的编译环境.Microsoft Visual C++这样,可能gcc就不是这样了

达孜县15561739643: c++内存已经被释放了为什么程序还占用内存 -
钊葛肝苏: getForPart执行时,内部调用了【动态分配内存】的函数,比如malloc,new等,会从“堆”里分配30M空间,这部分空间不会随函数结束而回收,需要自行回收.

达孜县15561739643: C++高手求解释占用内存大小原因 -
钊葛肝苏: 所有指针都是四个字节 int是四个字节 bool是一个还是四个字节我不知道,不过一个也好四个也好因为后面是int所以为了使得int的地址能对齐到4的倍数所以bool也就占的四个字节,就算是只占一个也会给你填充三个不用的字节进去.所以4+4+4=12

达孜县15561739643: C++的引用类型的变量到底占不占用内存空间 -
钊葛肝苏: 引用变量也会占用一个整形的空间,与指针不同的是,引用变量用一个别名指代对象,而指针是存放一块内存地址的变量.在这种概念下,对指向同一个对象的指针和引用变量分别做取地址操作,会发现指针取到的内存地址是一个与对象完全不...

达孜县15561739643: 装了个VC++为什么占了我C盘的内存? -
钊葛肝苏: Microsoft. NET Framework和Microsoft windows SDK for Visual Studio是只能安装在系统盘上的(也就是一般你的C盘) Microsoft SQL Server是可以安装到其他盘 但你必须先安装完整的Microsoft SQL Server 2005 当你先安装完整的Microsoft SQL Server 2005 你再安装Visual C++ 2008 Express Edition时 就不会提示你安装Microsoft SQL Server了 在安装Microsoft SQL Server 2005时 是可以选择路径的 麻烦采纳,谢谢!

达孜县15561739643: c++中为什么有些变量在编译是就由编译器分配了内存空间,还没有运行怎么会占用内存呢 -
钊葛肝苏: 还没有运行怎么会占用内存呢?!(这一点还要怀疑吗!?) 所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以明确计算出来,并且...

达孜县15561739643: 请问C++中怎么计算对象占用的内存啊? -
钊葛肝苏: 这里面涉及到对象内存的布局问题,类对象的大小等于其最宽基本类型的整数倍 你写的类中最宽类型是8位,那么整数倍就是32(要大于26).你可以试验一下把double类型改为int型,那么对象大小就会变成24了(要大于4+4+4+10=22).

达孜县15561739643: c/c++ 占用内存高,是什么原因 -
钊葛肝苏: 占用内存高是不是因为你的xml文件太大,而xml解析是用的dom的方式?占用cpu高,检查是否有死循环

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网