使用地图计算单词频率

时间:2015-04-10 19:07:02

标签: c++ dictionary stl operator-overloading

这是我第一次在C ++中实现map。因此,给定带有文本的字符数组,我想计算文本中出现的每个单词的频率。我决定实现map来存储单词并比较下面的单词并增加一个计数器。 以下是我到目前为止编写的代码。

  const char *kInputText = "\
  So given a character array with text, I want to count the frequency of
  each word occurring in the text.\n\
  I decided to implement map to store the\n\
  words and compare following words and increment a counter.\n";      

  typedef struct WordCounts
  {
       int wordcount;
  }WordCounts;

  typedef map<string, int> StoreMap;

  //countWord function is to count the total number of words in the text.
  void countWord( const char * text, WordCounts & outWordCounts )
  {
       outWordCounts.wordcount = 0;
       size_t i;
       if(isalpha(text[0]))
            outWordCounts.wordcount++;
       for(i=0;i<strlen(text);i++)
       {
            if((isalpha(text[i])) && (!isalpha(text[i-1])))
                 outWordCounts.wordcount++;
       }
       cout<<outWordCounts.wordcount;
  }

  //count_for_map() is to count the word frequency using map.
  void count_for_map(const char *text, StoreMap & words)
  {
       string st;
       while(text >> st)
            words[st]++;
  }

  int main()
  {
       WordCounts wordCounts;
       StoreMap w;
       countWord( kInputText, wordCounts );
       count_for_map(kInputText, w);
       for(StoreMap::iterator p = w.begin();p != w.end();++p)
       {
             std::cout<<p->first<<"occurred" <<p->second<<"times. \n";
       }
       return 0;
  }



  Error: No match for 'operator >>' in 'text >> st'
  I understand this is an operator overloading error, so I went ahead and
  wrote the following lines of code.
  //In the count_for_map()
       /*istream & operator >> (istream & input,const char *text)
       {
             int i;
             for(i=0;i<strlen(text);i++)
                 input >> text[i];
             return input;
       }*/
  Am I implementing map in the wrong way?

1 个答案:

答案 0 :(得分:4)

左侧>> const char*没有超载。

textconst char*,而不是istream,因此您的重载不适用(并且重载1:错误,2:标准库中已存在)

您希望使用更合适的std::istringstream,如下所示:

std::istringstream textstream(text);
while(textstream >> st)
    words[st]++;