C++-stl hash_map以char*作为键值时遇到的问题

C++-stl hash_map以char*作为键值时遇到的问题

偏爱自由 发布于 2016-12-27 字数 1070 浏览 1135 回复 2

大家看我下面这个程序我不知道有什么错误。

#include <stdio.h>
#include <ext/hash_map>
#include <string.h>

using namespace std;
using namespace __gnu_cxx;

struct eqstr {
bool operator() (char *s1, char *s2) const
{
return strcmp(s1, s2) == 0;
}
};

typedef hash_map<char *,int, hash<char *>, eqstr> Hash;

int main()
{
Hash hashdata;
FILE *fp = fopen("data.txt", "r"); //只有10行记录
FILE *fout = fopen("output.txt", "w");
char readStr[20];

while(fgets(readStr, sizeof(readStr), fp))
{
readStr[strlen(readStr)-1] = '';
hashdata[readStr]++;
}

printf("%dn", hashdata.size()); //很大
Hash::iterator ite1 = hashdata.begin();
Hash::iterator ite2 = hashdata.end();
for(; ite1 != ite2; ++ite1)
{
fprintf(fout, "%s: %dn", ite1->first, ite1->second);
}
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-08-17 2 楼

一句话来说就是:不能用char* ,要用string
其实严格来说并不是不能用char* ,问题是hash_map里面的key只保存了一个char* 指针。下次访问的时候,那个char* 里面的内容都被你改了,当然会出错了。
要么每次new一个char*出来保证存在里面不改,要么用string(推荐)。用string做键值貌似需要提供一个自定义的hash函数。

泛泛之交 2017-05-11 1 楼

很显然如果动态分配的char*完全可以

容器最要命的地方就是 拷贝 效率上 明显不足 和方便程度对比 弊大于利
采用指针的方式 动态分配内存 可以很好的 解决拷贝带来的低效率

继续用你的char* 没问题 不过内存要动态分配 也就是用new分配内存 !!

这道题目 主要是指针无法实现比较操作