1. ホーム
  2. c++

[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?

2022-03-15 08:56:19

質問

文字列の単語を反復処理しようとしています。

この文字列は、空白で区切られた単語で構成されていると仮定することができる。

なお、私はC言語の文字列関数やそのような文字操作・アクセスには興味がありません。また、回答は効率よりもエレガンスを優先してください。

今、私が持っている最適解は

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string s = "Somewhere down the road";
    istringstream iss(s);

    do
    {
        string subs;
        iss >> subs;
        cout << "Substring: " << subs << endl;
    } while (iss);
}

もっとエレガントな方法はないのでしょうか?

どのように解決するのですか?

参考までに、標準ライブラリの機能だけを利用して入力文字列からトークンを抽出する別の方法を紹介しよう。これは、STLの設計の背後にあるパワーとエレガンスの一例である。

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>

int main() {
    using namespace std;
    string sentence = "And I feel fine...";
    istringstream iss(sentence);
    copy(istream_iterator<string>(iss),
         istream_iterator<string>(),
         ostream_iterator<string>(cout, "\n"));
}

抽出されたトークンを出力ストリームにコピーする代わりに、同じ汎用的な copy というアルゴリズムがあります。

vector<string> tokens;
copy(istream_iterator<string>(iss),
     istream_iterator<string>(),
     back_inserter(tokens));

... あるいは vector を直接指定します。

vector<string> tokens{istream_iterator<string>{iss},
                      istream_iterator<string>{}};