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

发布于 2016-12-27 18:04:47 字数 1043 浏览 1263 评论 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);
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(2

灵芸 2017-08-17 06:10:03

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

泛泛之交 2017-05-11 09:23:19

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文