CLX C++ Libraries
Home >> salgorithm>> split

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

example_split.cpp

#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