map 所占的内存为什么比set 大太多

fx397993401 2013-03-21 10:49:02


#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<cstdio>
using namespace std;

const int N = 30000000;
void vec()
{
vector<int> vec_i;
vec_i.resize(N+2);
for(int i = 1 ; i<= N ; i ++) {
vec_i[i] = i;
}
getchar();
}

void vec2()
{
int * data ;
data = new int[N+2];

for(int i = 1 ; i<= N ; i ++) {
data[i] = i;
}
getchar();
}
void mapFun()
{
map<int,int> map_i;

for(int i = 1 ; i<= N ; i ++) {
map_i.insert(map<int,int>::value_type(i,i));
}
getchar();
}

void setFun()
{
set<int> set_i;

for(int i = 1 ; i<= N ; i ++) {
set_i.insert(i);
}
getchar();
}

int main()
{

mapFun();

return 0;
}


单独运行 mapFun 内存占用22.8%
vec 2.8% setFun 也是 2.8% 我的内存是4g ,想知道 map 的什么机制造成这样的情况
...全文
517 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tofu_ 2013-03-22
  • 打赏
  • 举报
回复
引用 9 楼 fx397993401 的回复:
引用 6 楼 tofu_ 的回复:亲测: 将N改为十分之一,也就是3000000,虚拟机内存不够,太大了扛不住。 win32下(xp + vs2010): mapFun()占用213.020M, setFun()占用189.460M, 比例是0.889 : 1 redhat 5.0下: mapFun()占用内存10.5%, setFun()占用内存7.9%……
数据量大的时候,deque比vector要好,因为前者是分段存储的,因此在数据减少的时候有可能收缩,而vector基本上不会。典型的实现下,vector基本上不需要额外的开销,而map对于每个元素,会耗费3.x个int的空间。
fx397993401 2013-03-22
  • 打赏
  • 举报
回复
引用 6 楼 tofu_ 的回复:
亲测: 将N改为十分之一,也就是3000000,虚拟机内存不够,太大了扛不住。 win32下(xp + vs2010): mapFun()占用213.020M, setFun()占用189.460M, 比例是0.889 : 1 redhat 5.0下: mapFun()占用内存10.5%, setFun()占用内存7.9%。 表示这个结果很符合理论期望。……
说错了 我更多的是想比较 vector 和 map , vector 在30000000 的时候 也就100M 。所以我比较纳闷 map 的内存机制
fx397993401 2013-03-22
  • 打赏
  • 举报
回复
引用 6 楼 tofu_ 的回复:
亲测: 将N改为十分之一,也就是3000000,虚拟机内存不够,太大了扛不住。 win32下(xp + vs2010): mapFun()占用213.020M, setFun()占用189.460M, 比例是0.889 : 1 redhat 5.0下: mapFun()占用内存10.5%, setFun()占用内存7.9%。 表示这个结果很符合理论期望。……
我的是你十倍的时候 setFun 也不到 140M
tofu_ 2013-03-22
  • 打赏
  • 举报
回复
引用 5 楼 fx397993401 的回复:
引用 3 楼 zhao4zhong1 的回复:参考C:\Program Files\Microsoft Visual Studio\VC98\Include\MAP 我用的是 linux 测试的 ,我去看看的他的实现 不知道能不能看懂 map 的底层是用vector 实现的? 估计和这个有关
标准库的map是红黑树,只有哈希map才可能会用vector来存放“桶”。
tofu_ 2013-03-22
  • 打赏
  • 举报
回复
亲测: 将N改为十分之一,也就是3000000,虚拟机内存不够,太大了扛不住。 win32下(xp + vs2010): mapFun()占用213.020M, setFun()占用189.460M, 比例是0.889 : 1 redhat 5.0下: mapFun()占用内存10.5%, setFun()占用内存7.9%。 表示这个结果很符合理论期望。 N扩大十倍之后,操作系统已经不能容忍你占据这么大内存了,所以将大量数据交换至硬盘缓存,你最后看到的内存占用也许不精确。建议你缩小N再测试。
fx397993401 2013-03-22
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
参考C:\Program Files\Microsoft Visual Studio\VC98\Include\MAP
我用的是 linux 测试的 ,我去看看的他的实现 不知道能不能看懂 map 的底层是用vector 实现的? 估计和这个有关
fx397993401 2013-03-22
  • 打赏
  • 举报
回复
引用 2 楼 liao05050075 的回复:
map中保存的是key 和value的键值对,比set\vector多了一个key,自然占的内存要多些
但是多出的内存将近五倍多 ,
赵4老师 2013-03-21
  • 打赏
  • 举报
回复
参考C:\Program Files\Microsoft Visual Studio\VC98\Include\MAP
liao05050075 2013-03-21
  • 打赏
  • 举报
回复
map中保存的是key 和value的键值对,比set\vector多了一个key,自然占的内存要多些
图灵狗 2013-03-21
  • 打赏
  • 举报
回复
map的数据结构本身就比set要复杂。

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧