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

C++で文字列内の単語を反復処理する最もエレガントな方法


文字列の単語を反復処理するには

C/C++の文字列に含まれる単語を反復処理する「唯一のエレガントな方法」は存在しません。可読性の高さを重視して最もエレガントと考える人もいれば、パフォーマンスの高さこそがエレガントだと考える人もいます。ここでは、このタスクを実現するための方法として、stringstreamを使ってスペースで区切られた単語を読み取る手法を紹介します。この方法はやや制限がありますが、適切なチェックを組み合わせれば十分に目的を果たせます。

サンプルコード

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string str("Hello from the dark side");
    string tmp; // 各反復で単語を格納するための文字列
    stringstream str_strm(str);
    vector<string> words; // 単語を保持するためのvectorを作成

    while (str_strm >> tmp) {
        // ここでtmpに対して空チェックなどの適切な検証を行う
        // 記号(!、.、?など)を取り除く処理も必要に応じて追加
        // 最後にvectorへ追加する
        words.push_back(tmp);
    }
    for(int i = 0; i<words.size(); i++)
        cout << words[i] << endl;
}

実行結果

Hello
from
the
dark
side

解説のポイント

str_strm >> tmp の抽出演算子は、空白文字を自動的にスキップしながら1単語ずつ読み込むため、whileループと組み合わせるだけで簡単に単語分割を実現できます。

ただし、この方法にはいくつか注意点があります。連続する空白は問題なく処理できる一方、カンマやピリオドなどの記号は自動的には取り除かれません。記号を除外したい場合は、ループ内でtmpの先頭・末尾を走査し、不要な文字を削除する処理を追加しましょう。また、抽出に失敗するとストリームが失敗状態になるため、whileループの条件式がそのまま終了判定として機能する仕組みになっています。

  1. C++で一方の文字列の部分文字列がもう一方の文字列にいくつ含まれるかを調べる方法

    この記事では、2つの文字列が与えられたとき、1つ目の文字列の部分文字列のうち、2つ目の文字列内に存在するものがいくつあるかを求める方法を解説します。なお、同じ部分文字列が複数回出現する場合は、その回数もカウント対象となります。具体例入力 : string1 = fogl string2 = google 出力 : 6 説明 : string2 内に存在する string1 の部分文字列は [ o, g, l, og, gl, ogl ] の6個です。 入力 : string1 = ajva string2 = java 出力 : 5 説明 : str

  2. C++で文字列の部分文字列の総数を求める方法を解説

    この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文