如何解决C ++中的字数统计程序[重复]
| 这个问题已经在这里有了答案:解决方法
您想要一个
std::map<std::string,int>
-您的char*
映射将比较指针而不是它们指向的字符串。
,默认情况下,2ѭ在键类型上使用operator <
进行比较。 char *
上的3ѭ比较指针地址,而不是字符串的字符。
您想改用std::map<std::string,int>
,因为std::string
上的operator <
进行词法字符串比较。
,您必须为const char *
做一个自己的比较类:
struct StrCmp {
static bool operator() (const char *a,const char *b) {
return strcmp(a,b)<0;
}
};
然后,您可以使用地图:
typedef std::map<char const *,int,StrCmp> word_count_t;
,首先,您应该真正使用一些HashMap实现。 std :: map是TreeMap,在对巨大文本中的单词进行计数时会变慢。这是由于以下事实:文本中出现的大量单词将映射到中等数量的不同单词。即使您需要对输出进行排序,之后对哈希图进行排序也可能会更好,因为插入树中将是#occurrences * log #words,而将它们排序将是O(#words * log #words)
除此之外,大多数哈希映射实现(我个人通常使用google :: dense_hash_map或google :: sparse_hash_map)都可以处理char *,而无需编写哈希函数(它们使用stl哈希函数)。因此,它基本上为您即插即用。
,键是不同的,因为它们是char*
,也就是说,指针指向内存中的其他位置。如果您使用std::map<std::string,int>
,而又使用++word_count[std::string(token)]
,则将获得预期的输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。