C++ で単語の出現数を数える

This entry was posted by on Saturday, 15 January, 2005
>えーまあ、敢えて word_count 関数を残しますが、まあ普通はこうじゃないですかね。 > >#include <iostream>
#include <list>
#include <map>
#include <string>

using namespace std;

inline void
word_count (const list<string> &strs, map<string, int> &word_map)
{
for (list<string>::const_iterator i = strs.begin(); i != strs.end(); i++)
word_map[*i]++;
}

int
main (void)
{
list<string> strs;
map<string, int> word_map;

strs.push_back("Alice");
strs.push_back("Bob");
strs.push_back("Alice");

word_count(strs, word_map);

for (map<string, int>::iterator i = word_map.begin(); i != word_map.end(); i++)
cout << i->first << ": " << i->second << "\n";
return 0;
} > >キモは2つ。 > > >map::operator > > > >こういう関数の場合、参照で返すよりは引数から参照渡しする方が自然な気がする。 > > > > >まあ僕も偉そうなことを言えるほどの知識はないですし、簡潔さについていうと、実際そこまで簡潔とは言いがたいわけです。が、まあ、これくらいなら我慢できないほどではないかな、と。 > >ただし、たとえば「標準入力もしくは引数指定したファイルの中身の単語数カウント」という場合の簡潔さは、 Ruby とかのスクリプトに比べると複雑化するとは思いますけれど。 > >あーそれから、 first と second についてはそういうものだと思うしかないような。タプルから値を取り出す関数だって似たような名前じゃん。 car と cdr みたいなもんじゃん。イテレータじゃなくて、たとえば値だけだとキーが欲しいときに困るし、キーだけだと値を取り出すときに map で検索しなおすのはアホみたいだし、かといってキーと値の両方に変数を束縛するような記法はC++ じゃ難しいし、一緒くたに扱うべく Pair を利用するってそんなに変かなあ。あと map::end() は実体を指すわけではない一種のヌルポインタみたいな扱いだから、アルゴリズム的にはそんなに違和感を感じないな。インスタンスごとに end() があるのかよ、と思うとちょっと違和感は覚えるけど、 deque のイテレータみたいに、 end() から逆方向にたぐってくことができるものもあったりするわけで。 >

Comments are closed.