Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;_C++ - Fatal编程技术网

C++ C++;

C++ C++;,c++,C++,可能重复: 嗨, 自从我做C++编程以来,已经有很长时间了。 这可能是一个相当愚蠢的问题。 我在这个网站上找到了几个关于字数统计的程序。 但是他们大多数都使用std::string作为键。 在我的例子中,我需要使用char*作为我的密钥。 但似乎因为每个char*都有不同的地址值,所以重复的键被插入到我的映射中 char str[] = "This This"; typedef std::map<char*, int> word_count_t; typedef word_coun

可能重复:

嗨,
自从我做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();
}
charstr[]=“This”;
typedef std::映射单词计数;
typedef word_count_t::迭代器word_count_iter;
int _tmain(int argc,_TCHAR*argv[]
{
char*token=strtok(str,“”);
字数;
单词计数itr=NULL;
while(令牌){
++字数[记号];
令牌=strtok(空,“”);
}
for(itr=word_count.begin();itr!=word_count.end();itr++){

std::cout您想要一个
std::map
-您的
char*
映射将比较指针而不是它们指向的字符串。

您想要一个
std::map
-您的
char*
映射将比较指针而不是它们指向的字符串。

std::map
默认情况下使用
操作符
std::map
>默认情况下,使用
运算符您必须为
常量字符*
创建自己的比较类:

struct StrCmp {
    static bool operator() (const char *a, const char *b) {
        return strcmp(a, b)<0;
    }
};
struct StrCmp{
静态布尔运算符()(常量字符*a,常量字符*b){

返回strcmp(a,b)您必须为
常量字符*
创建自己的比较类:

struct StrCmp {
    static bool operator() (const char *a, const char *b) {
        return strcmp(a, b)<0;
    }
};
struct StrCmp{
静态布尔运算符()(常量字符*a,常量字符*b){

返回strcmp(a、b)首先,您真的应该使用一些HashMap实现。std::map是一个树形图,在计算一个巨大文本中的单词时会比较慢。这是因为,文本中出现的大量单词将映射到一个中等数量的不同单词。即使您需要对输出进行排序,也要在之后对HashMap进行排序可以更好,因为插入到树中的将是#事件*日志#单词,而排序它们的将是O(#单词*日志#单词)


除此之外,大多数hashmap实现(我个人通常使用google::dense\u hash\u map或google::sparse\u hash\u map)可以处理char*而无需编写哈希函数(它们使用stl哈希函数)。因此,它基本上是您的即插即用。

首先,您应该真正使用一些HashMap实现。std::map是一个树状图,在计算大量文本中的单词时会更慢。这是因为,文本中出现的大量单词将映射到少量不同的单词。即使您需要输出要进行排序,可以在之后对hashmap进行排序,因为插入到树中的将是#事件*日志#单词,而对它们进行排序的将是O(#单词*日志#单词)


除此之外,大多数hashmap实现(我个人通常使用google::dense\u hash\u map或google::sparse\u hash\u map)可以处理char*而无需编写哈希函数(它们使用stl哈希函数)所以它基本上就是你的即插即用。

键是不同的,因为它们是
char*
,也就是说,指向内存中不同位置的指针。如果你使用
std::map
并进行
++字数[std::string(token)]
您将获得预期的输出。

键是不同的,因为它们是
char*
,即指向内存中不同位置的指针。如果您使用
std::map
并执行
++字数[std::string(token)]
您将获得预期的输出。

地图不能有重复的键,您应该使用多重地图。@Als他不需要重复的键。@Nawaz除了他不计算文件中的单词之外。地图不能有重复的键,您应该使用多重地图。@Als他不需要重复的键。@Nawaz除了他不计算文件中的单词之外。