C++ の boost::split 関数

胡金庫 2023年10月12日
  1. boost::split 関数を使用して、指定された文字列をトークン化する
  2. 文字列を区切り文字で stringstreamgetline 関数を使用して分割する
C++ の boost::split 関数

この記事では、C++ で boost::split 関数を使用する方法を説明します。

boost::split 関数を使用して、指定された文字列をトークン化する

Boost は、成熟した十分にテストされたライブラリで C++ 標準ライブラリを拡張するための強力なツールを提供します。この記事では、Boost 文字列アルゴリズムライブラリの一部である boost::split 関数について説明します。後者には、トリミング、置換などのいくつかの文字列操作アルゴリズムが含まれています。

boost::split 関数は、指定された文字列シーケンスを区切り文字で区切られたトークンに分割します。ユーザーは、区切り文字を 3 番目のパラメーターとして識別する述語関数を指定する必要があります。指定された要素が区切り文字である場合、提供された関数は true を返す必要があります。

次の例では、isspace 関数オブジェクトを指定して、指定されたテキスト内のスペースを識別し、それらをトークンに分割します。boost::split には、トークン化されたサブ文字列を格納するための宛先シーケンスコンテナも必要です。宛先コンテナーは最初のパラメーターとして渡され、その前の内容は関数呼び出し後に上書きされることに注意してください。

#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  boost::split(words, text, isspace);
  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;

前のコードスニペットの boost::split 呼び出しは、2つ以上の区切り文字が隣り合っている場合、空の文字列を格納します。ただし、4 番目のオプションパラメータである boost::token_compress_on を指定すると、次の例に示すように、隣接する区切り文字がマージされます。これらの 2つのコードスニペットを正常に実行するには、Boost ライブラリをシステムにインストールする必要があることに注意してください。

#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  boost::split(words, text, isspace, boost::token_compress_on);
  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

Lorem; ipsum; dolor; sit; amet,; consectetur; adipiscing; elit.;

文字列を区切り文字で stringstreamgetline 関数を使用して分割する

または、stringstream クラスと getline 関数を使用して、指定された文字区切り文字でテキストを分割することもできます。この場合、STL ツールのみを使用し、Boost ヘッダーを含める必要はありません。このコードバージョンはかさばり、隣接する区切り文字をマージするために追加の手順が必要であることに注意してください。

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

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  char space_char = ' ';
  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, space_char)) {
    words.push_back(word);
  }

  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Boost