CLX C++ Libraries - split
Author: clown

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