您好,
我做C ++编程已经很久了
这可能是一个非常愚蠢的问题
我在这个网站上找到了几个有关字数的程序
但他们中的大多数人都使用std::string
作为他们的钥匙
在我的情况下,我需要使用char*
作为我的密钥
但似乎每个char*
都有不同的地址值,重复的键会插入我的地图中。
char str[] = "This This";
typedef std::map<char*, int> word_count_t;
typedef word_count_t::iterator word_count_iter_t;
int _tmain(int argc, _TCHAR* argv[])
{
char *token = strtok(str, " ");
word_count_t word_count;
word_count_iter_t itr = NULL;
while(token) {
++word_count[token];
token = strtok(NULL, " ");
}
for(itr = word_count.begin(); itr != word_count.end(); itr++) {
std::cout << "Key: " << itr->first << ", Value: " << itr->second << std::endl;
}
getchar();
}
我得到的这个程序的输出是
Key:This,Value:1
关键:这个,价值:1
我想要输出
Key:This,Value:2
有人能告诉我在哪里错过了什么吗?
感谢。
答案 0 :(得分:2)
你想要一个std::map<std::string, int>
- 你的char*
地图将比较指针而不是它们所指向的字符串。
答案 1 :(得分:1)
std::map
会在密钥类型上使用operator <
进行比较。 operator <
上的char *
比较指针地址,而不是字符串的字符。
您希望使用std::map<std::string, int>
代替operator <
std::string
进行词法字符串比较。
答案 2 :(得分:1)
您必须为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;
答案 3 :(得分:0)
首先,您应该使用一些HashMap实现。 std :: map是一个TreeMap,在计算大文本中的单词时速度会慢一些。这是因为文本中大量的单词出现将被映射到适量的不同单词。即使你需要对输出进行排序,之后对hashmap进行排序可能会更好,因为插入树中将是#occurrences * log #words,而排序它们将是O(#words * log #words)
除此之外,大多数hashmap实现(我个人通常使用google :: dense_hash_map或google :: sparse_hash_map)可以处理char *而无需编写哈希函数(它们使用stl哈希函数)。所以它基本上是插件和为你而战。
答案 4 :(得分:0)
键是不同的,因为它们是char*
,即指向内存中不同位置的指针。如果您使用了std::map<std::string, int>
并且执行了++word_count[std::string(token)]
,那么您将获得预期的输出。