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.;
文字列を区切り文字で stringstream
と getline
関数を使用して分割する
または、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.;