C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のstringstreamを使った単語数カウントと頻度集計の方法

本記事のサンプルコードでは、C++のstringstreamを使用して、文字列内の総単語数をカウントする方法と、特定の単語の出現頻度を集計する方法を解説します。

stringstreamクラスは、stringオブジェクトをストリームと結び付けるクラスです。これにより、文字列をあたかも入力ストリームであるかのように扱い、cinと同じ感覚で単語を一つずつ読み取ることができます。

このコードは2つの機能を実現します。まず文字列内の単語の総数をカウントし、次にmapコンテナとイテレータの基本的なメソッドを活用して、各単語の出現頻度を計算します。実装は以下の通りです。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int totalWords(string str){
   stringstream s(str);
   string word;
   int count = 0;
   while (s >> word)
      count++;
   return count;
}
void countFrequency(string st){
   map<string, int> FW;
   stringstream ss(st);
   string Word;
   while (ss >> Word)
      FW[Word]++;
   map<string, int>::iterator m;
   for (m = FW.begin(); m != FW.end(); m++)
      cout << m->first << " = " << m->second << "\n";
}
int main(){
   string s = "Ajay Tutorial Plus, Ajay author";
   cout << "Total Number of Words=" << totalWords(s)<<endl;
   countFrequency(s);
   return 0;
}

コードの解説

totalWords関数: 文字列をstringstreamに渡し、抽出演算子(>>)で単語を1つずつ取り出しながらカウントしています。whileループは単語を取り出せなくなるまで繰り返されるため、ループ終了時のcountが総単語数となります。

countFrequency関数: map<string, int>型のコンテナを使用し、単語をキーとして出現回数を記録します。FW[Word]++の操作により、同じ単語が現れるたびに対応する値が1ずつ増加します。mapはキーで自動的にソートされるため、出力結果はアルファベット順に並びます。

実行結果

文字列「Ajay Tutorial Plus, Ajay author」をこのプログラムに与えると、単語の総数と各単語の頻度が以下のように出力されます。

Enter a Total Number of Words=5
Ajay=2
Tutorial=1
Plus,=1
Author=1

このように、stringstreamとmapを組み合わせることで、文字列の解析や頻度集計を簡潔に実装できます。テキスト処理やログ解析など、さまざまな場面で応用できるテクニックなので、ぜひ活用してください。

  1. C++で文字列をトークン化する方法:stringstreamとgetline()による分割テクニック

    この記事では、C++における文字列のトークン化(分割)の方法について解説します。C言語では、文字配列に対してstrtok()関数を使用することで文字列を分割できましたが、C++ではstd::stringクラスを扱うため、少し異なるアプローチが必要です。C++の機能を活用して文字列を分割するには、まずstd::stringをstringstream(文字列ストリーム)に変換します。その後、getline()関数を使うことで、指定した区切り文字(デリミタ)ごとに文字列を切り出すことができます。getline()関数は、以下の3つの引数を受け取ります。入力元となる文字列ストリーム出力結果を格納する文

  2. C++で文字列をトークン化(分割)する2つの方法を解説

    文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string