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)]
,则将获得预期的输出。