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] = '\0';
hashdata[readStr]++;
}

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

这里遍历hash_map的时候值很大数量很多,而且我读入的文件只有10行记录,这个是为什么呢?

STL(C++) C++

绝对领域控 12 years, 4 months ago

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

Mr_少俠 answered 12 years, 4 months ago

Your Answer