kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

Boost String Algorithms Library

Boost String Algorithms Library

ちょっとづつ更新

名前空間/ヘッダ

boost::algorithm
長いのでbaと記述する

#include<boost/algorithm/string.hpp>
namespace ba = boost::algorithm;

ba::split(&Result, &Input, Pred, eCompress = token_compress_off)

Pred(セパレータ)の文字で、文字列Inputを分割して、結果をResultに入れる。
Predには、空白区切りならba::is_space(),
(複数の)1文字デリミタを使うならba::is_any_of()を使う。
空文字列を切り詰めるならba::token_compress_onを指定。
デフォルトでba::token_compress_offが指定されている。

string original = " \tABC DEFG HIJKL MNOPQ RSTU \t VWXYZ \t";

vector<string> res;
cout << "split(res,original,is_space())\n\t→";
ba::split( res, original, ba::is_space() );
for(size_t i=0; i < res.size(); ++i) cout << "[" << res[i] << "]"; cout<<endl;

cout << "split(res,original,is_any_of(\" \\tU\"))\n\t→";
ba::split( res, original, ba::is_any_of(" \tU") );
for(size_t i=0; i < res.size(); ++i) cout << "[" << res[i] << "]"; cout<<endl;

cout << "split(res,original,is_any_of(\" \\tU\"),token_compress_on)\n\t→";
ba::split( res, original, ba::is_any_of(" \tU"), ba::token_compress_on );
for(size_t i=0; i < res.size(); ++i) cout << "[" << res[i] << "]"; cout<<endl;

結果
ありゃ?token_compress_onしても最初と最後の空文字列が残ってるぞ。
Boost.Tokenizerのdrop_empty_tokensはちゃんと切り詰められていたけど...

split(res,original,is_space())[][][ABC][DEFG][HIJKL][MNOPQ][RSTU][][][VWXYZ][][]
split(res,original,is_any_of(" \tU"))[][][ABC][DEFG][HIJKL][MNOPQ][RST][][][][VWXYZ][][]
split(res,original,is_any_of(" \tU"),token_compress_on)[][ABC][DEFG][HIJKL][MNOPQ][RST][VWXYZ][]

ba::join(const &Input, const &Separator)

文字列シーケンス(stringの配列とかvector)InputをSeparatorの文字列を挟んで連結

string splited[] ={"join", "test", "!!!"};
cout << ba::join( splited, "__" ) << endl;

結果

join__test__!!!