hash_map的问题

wiw 2008-03-31 09:09:13
#include "hash_map"
#include "iostream"
typedef stdext::hash_map<char*,string> hm;
int _tmain(int argc,char* argv[])
{
hm hashMap;
hashMap["abc"]="abc";
hashMap["def"]="def";
char buf[5]={'\0'};
cout<<hashMap["abc"]<<endl;
strcpy(buf,"abc");
cout<<hashMap[buf]<<endl;
}

请问,为什么打印的这两行不相同?我想是指针的问题,那么怎么能打印这两行相同的内容呢?
...全文
258 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vitin 2008-04-02
  • 打赏
  • 举报
回复
同意mathe的说法。

g++使用了equal_to;VS(VC)使用了less,用两次<来实现=语义.估计写hash_map的和写map的是同一批人,顺手就写成这样了。他们当然也是有理由的:这样适用于map的类也都适用于hash_map了。至于语义、效率等等的问题,都不用考虑啦,这是M$的风格。

等到C++09出了hash_map的标准后就不会有这种差异了,呵呵。
不想低调 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Supper_Jerry 的回复:]
大师们在上面。我不敢说话。路过
[/Quote]
taodm 2008-04-02
  • 打赏
  • 举报
回复
现在比较大的问题是hash被滥用。
以及,很多人不看一下STL等库的帮助文档就凭猜测在用STL等库。
mathe 2008-04-02
  • 打赏
  • 举报
回复
从hash_map的特性来说,应该不需要特化less,而只需要特化euqal_to就可以了(从而我们可以将hash_map用于一些只定义了operator=而没有定义严格比较关系(operator<)的数据类型),不知道是VC还是g++使用了less?我觉得这种使用方法不是很合理。
当然,现在比较大的问题是hash_map不属于标准,所以使用时还是谨慎点好。
visame 2008-04-02
  • 打赏
  • 举报
回复
mathe好厉害哦!
其实我觉得你把源代码翻出来看看就啥都明白了。
如果内部实现用的是strcmp,就如你所愿了。
小落勇士 2008-04-01
  • 打赏
  • 举报
回复
p1 -----> "abc"

char* strcpy(char* dest, const char* src)
{
assert(dest!=null&& src!=null);
while((*dest++)=(*src++))!='\0');
return dest;
}
所以调用后,我们得到另一个指针
p2 ----> "abc"

hashmap[p1] hashmap[p2]的位置自然不同,
所以楼主可以使用hashmap<string,string>,但是这样似乎自己要写hash函数
urstar 2008-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jimmy_w 的回复:]
LZ可能以为map是按照字面值来作为key的
[/Quote]

喜欢六楼的头像,呵呵
不过在java里面HashMap就是用字面值来作为key的~~不太懂C++,看来还真是差好多,恩,我也来学习一下
Supper_Jerry 2008-04-01
  • 打赏
  • 举报
回复
大师们在上面。我不敢说话。路过
Vitin 2008-04-01
  • 打赏
  • 举报
回复
呵呵,可以试着在VS或g++上运行一下就知道有没有效果了。

hash_map确实需要hash函数来计算hash值;但是,hash值相等并不意味者key值相等。
目前hash_map的实现方法往往是调用一个标准的比较函数来判断key值是否相等。

没有特化hash函数,是因为默认的hash函数已经对const char*作了特化(使用其所指字符串的字面值来计算hash值)。

当然如我之前所说,目前没有标准,只能说在某某编译器上应该如何做。
mathe 2008-04-01
  • 打赏
  • 举报
回复
Vitin好像终于犯了次错误了。
hash_map不使用less的,特化比较函数没有用
要特化hash函数
Vitin 2008-04-01
  • 打赏
  • 举报
回复
akirya的方案正确。

此外,也可以通过特化比较函数的方法,代码如下:

namespace std
{
// for VS
template<>
struct less<char*>: public binary_function<char*, char*, bool>
{
public:
bool operator()(const char* l, const char* r) const
{
while (*l || *r)
{
if (*l != *r)
return *l < *r;
++r;
++l;
}
return false;
}
};

// for g++
template<>
struct equal_to<char*>: public binary_function<char*, char*, bool>
{
public:
bool operator()(const char* l, const char* r) const
{
while (*l || *r)
{
if (*l++ != *r++)
return false;
}
return true;
}
};
};

需要注意的是,这个方案其实依赖于实现(如VS和g++就使用不同的比较函数。当然,事实上hash_map目前不属于标准库,它的所有特性都是依赖于实现的)。
  • 打赏
  • 举报
回复
LZ可能以为map是按照字面值来作为key的
ryfdizuo 2008-03-31
  • 打赏
  • 举报
回复
呵呵,lz找本基础的书看一下吧,
taodm 2008-03-31
  • 打赏
  • 举报
回复
楼主啊,C语言时代的字符串和字符串常量基本功还不过关啊。
最好补补课,莫于浮沙筑高台。
  • 打赏
  • 举报
回复
因为你key存的是指针,不是内容

这样key就是使用字符串内容了
typedef stdext::hash_map <string,string> hm;
ttkk_2007 2008-03-31
  • 打赏
  • 举报
回复
hashMap["abc"]="abc";
===================
“abc”存储在常量存储区
buf数组存储在堆栈里,指针不同
ttkk_2007 2008-03-31
  • 打赏
  • 举报
回复

strcpy(buf,"abc");
hashMap[buf] = "abc";

64,676

社区成员

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

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