STL Hash_map 在插入自定义类型后,为什么无法修改自定义类型的成员值?100分

kfzdp 2008-03-04 05:07:50
hash_map 声明为值类型:

hash_map<int,PROC_STAT> Curr_State_List

自定义类型声明:
typedef struct _PROC_STAT
{
int stat_id;
char name[64];
int stat_type;
char last_submit[30]; //上次提交时间
int val;
char mess[512];
char remark[255];
}PROC_STAT

在hash_map中插入(insert(pair<int,PROC_STAT>(1,tmp)))数据后,想修改PROC_STAT里面成员内容,但无效。

是不是我声明的 hash_map 有问题?hash_map的 insert操作是怎样的?是不是复制了内容,所以无法修改?

请高手解答一下,我初学者,不好意思。
...全文
400 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-03-05
  • 打赏
  • 举报
回复
((abc)itemhash-> second).b=3443;
((abc)ihash[1]).b=32423;

===>

(itemhash-> second).b=3443;
(ihash[1]).b=32423;

抱谦,你根本不知道自己在做了什么.
kfzdp 2008-03-05
  • 打赏
  • 举报
回复
我上面那段代码你跑跑看下,确实是无法改自定义类型成员的值
Supper_Jerry 2008-03-05
  • 打赏
  • 举报
回复
不能修改键但是能修改值,
Supper_Jerry 2008-03-05
  • 打赏
  • 举报
回复
声明为 hash_map <int,abc> ihash; 是不是就无法修改 abc里成员的内容的?
不会的。
kfzdp 2008-03-05
  • 打赏
  • 举报
回复
发表于:2008-03-04 23:43:568楼 得分:0
你这样用int用haskMap的Key,那还不如用vector来得方便...

查找和修改的时间复杂度都由O(log(n))降为O(1)




我用 int 是举个例子,主要是说明这个事儿。


再问各位确定一下,声明为 hash_map <int,abc> ihash; 是不是就无法修改 abc里成员的内容的?
kfzdp 2008-03-05
  • 打赏
  • 举报
回复
明白了,转型后等于是复制出了临时变量,赋值修改了临时变量的值,所以原对象内容没有修改。
明白了,多谢。
唐巧 2008-03-04
  • 打赏
  • 举报
回复
你这样用int用haskMap的Key,那还不如用vector来得方便...

查找和修改的时间复杂度都由O(log(n))降为O(1)
Supper_Jerry 2008-03-04
  • 打赏
  • 举报
回复
这样声明的话,hash_map.insert时是否只是个指针?
是的。
如果过了abc 的作用域,hash_map里面的内容是否也会消失?
里面还是有指针的。但是指向的数据已经被释放了。
kfzdp 2008-03-04
  • 打赏
  • 举报
回复
代码在这里
class abc
{
public:
int a;
int b;
};

int main()
{
hash_map <int,abc> ihash;
hash_map <int,abc>::iterator itemhash;

abc aa;
aa.a=1;
aa.b=2;
ihash[1]=aa; //插入数据

for(itemhash=ihash.begin();itemhash!=ihash.end();itemhash++)
{


//对已插入的数据修改 这两个修改未起作用
((abc)itemhash->second).b=3443;
((abc)ihash[1]).b=32423;

cout<<"key:"<<itemhash->first<<endl;
abc tmp=(abc)itemhash->second;
cout<<"value:"<<tmp.b<<endl; //输出还为 2

}

}


如果把hash_map定义改为 hash_map <int,abc*> ihash; 则一切正常,可以正常修改 abc的成员内容。但还有个问题,这样声明的话,hash_map.insert时是否只是个指针?如果过了abc 的作用域,hash_map里面的内容是否也会消失?
多谢各位。
ytfhwfnh 2008-03-04
  • 打赏
  • 举报
回复
这样试一下:
Curr_State_List[1] = tmp;
Jim_King_2000 2008-03-04
  • 打赏
  • 举报
回复
map是不可以修改数据的。如果你一定要修改,那就删了再重新插入。
cad_vc 2008-03-04
  • 打赏
  • 举报
回复
为PROC_STAT 定义拷贝构造函数和赋值函数。
Supper_Jerry 2008-03-04
  • 打赏
  • 举报
回复
你应当对这个结构体定义一个operator=
否则插入的时候进行的是浅拷贝。
你的问题很可能出在这里。
taodm 2008-03-04
  • 打赏
  • 举报
回复
初学者就先用map吧.你现在用hash肯定属于滥用.
你也没贴出错的代码,属于无效提问.
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-04 05:07
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下