Declarations
Container& split(const String& s, Container& result, bool emtok = false, const std::locale& loc = std::locale()); Container& split_if(const String& s, Container& result, PredicateFunc f, bool emtok = false); String& join(const Container& v, String& result, const String& delim);
Overview
split() は,空白文字を区切り文字として文字列を分割し,結果を Container に格納します. そのため,Container には std::vector<String> など,分割した文字列を格納できるもの を指定する必要があります.split_if() は,空白文字の代わりに PredicateFunc で指定した Functor が真を返す文字を区切り文字として文字列を分割します.split(),split_if() の引数 emtok を true に指定すると,区切り文字が連続して現れたときに 2 つのトークンとして扱います (片方は空のトークン).
join() はその逆関数であり,Container に格納されている文字列群を文字列 delim を区切り文字として結合し,一つの文字列にして返します.
尚,Declarations においては template < ... > の部分を省略していますが, 単語の先頭が大文字になっているものはテンプレート引数として渡される型です(ただし, String は std::basic_string<CharT, Traits>).
Example
#include <iostream> #include <string> #include <vector> #include "clx/salgorithm.h" int main(int argc, char* argv[]) { std::string s = "apple orange,strawberry pineapple,,,"; std::cout << "original: " << s << std::endl; /* * スペース,タブ文字,コンマを区切り文字として分割する. * ただし,空のトークンは認めない(無視する). */ std::cout << "split: "; std::vector<std::string> tok; clx::split_if(s, tok, clx::is_any_of(" \t,")); for (unsigned int i = 0; i < tok.size(); i++) { std::cout << '<' << tok.at(i) << "> "; } std::cout << std::endl; std::string result; clx::join(tok, result, "="); std::cout << "join: " << result << std::endl; return 0; }
Result original: apple orange,strawberry pineapple,,, split: <apple> <orange> <strawberry> <pineapple> join: apple=orange=strawberry=pineapple