こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

頻度のプログラムについて

Windows XP コンパイラ gcc C++言語

入力した文字列の中から単語(スペースで区切られた)とその単語の頻度を出力するプログラムを作成しようと考えています。
そこで以下のように自分なりに考えてみました。

#include <iostream>
#include <map>
#include <string>
using namespace std;
struct Count{
int N;
Count() :
N(0){
}
operator int(){
return N;
}
void operator++(){
N++;
}
};
typedef map<string,Count> Map;
int main(){
Map m;
string word;
while ( cin >> word )
++m[word];
for(Map::iterator i=m.begin(),end=m.end(); i!=end; i++){
cout << i->first << ':' << i->second << endl;
}
return 0;
}

これで一応期待どうりの動作をするのですが、5行目~16行目のCountの構造体の中身についてなのですが、
この部分はmapに関する授業の中で参考としてでてきたものを引用して完成させたものなのでよく分かっていません。
今、先生との連絡が取れない状態なのでここに質問させていただきました。
5行目~16行目の部分について出来れば一行ずつ詳しく説明していただければと思います。
それと22行目の++m[word]についてなんですが、初め前置インクリメントか?と思い、
m[word]++として後置インクリメントとしてコンパイルしたところエラーになりました。
考え方がおかしいとしても、どう考えたら良いのかあやふやです。ここの++部分もちょっと疑問なので説明していただけると幸いです。
お願いいたします。

投稿日時 - 2006-12-24 23:51:46

QNo.2623564

困ってます

質問者が選んだベストアンサー

結構C++の基本的なところの質問だと思いますが。
structで書いてありますけどこれはクラス定義です。
struct Count{ // Countクラスを定義する。
 int N; //メンバ変数N
 Count() : // コンストラクタを定義、呼び出されたときにNの値を0とする
 N(0){
 }
 operator int(){ // intへの型変換。Countクラスの値をintに代入するときなどに使われる。
  return N;
 }
 void operator++(){ // ++ という演算子を定義。Nの値をひとつ増やす。
  N++;
 }
};
という意味になります。
だから22行目の++は前置インクリメントではなく上記のメソッドで定義された演算子++の呼び出しです。この書き方だと前置のときの処理しか定義されていないのです。
http://sato-si.at.webry.info/200503/article_3.html 参照。
また、変換演算子については
http://www.geocities.jp/ky_webid/cpp/language/029.html
などを参考にしてください。

投稿日時 - 2006-12-25 00:09:01

お礼

ご回答ありがとうございます。
細かい説明のおかげで納得できました。
参考URLも活用させていただきます。
ありがとうございました。

投稿日時 - 2006-12-26 11:38:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)