C++-stl hash_map以char*作为键值时遇到的问题
大家看我下面这个程序我不知道有什么错误。
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一句话来说就是:不能用char* ,要用string
其实严格来说并不是不能用char* ,问题是hash_map里面的key只保存了一个char* 指针。下次访问的时候,那个char* 里面的内容都被你改了,当然会出错了。
要么每次new一个char*出来保证存在里面不改,要么用string(推荐)。用string做键值貌似需要提供一个自定义的hash函数。
很显然如果动态分配的char*完全可以
容器最要命的地方就是 拷贝 效率上 明显不足 和方便程度对比 弊大于利
采用指针的方式 动态分配内存 可以很好的 解决拷贝带来的低效率
继续用你的char* 没问题 不过内存要动态分配 也就是用new分配内存 !!
这道题目 主要是指针无法实现比较操作