C++ Boost

char_separator<Char, Traits>

char_separator クラスは strtok() と同じように、 文字列を区切り文字に基づいてトークンに分解する。 (but without all the evils of non-reentrancy and destruction of the input sequence).

char_separator クラスは token_iterator クラスや tokenizer クラスと一緒に使用される。

Definitions

strtok() 関数は出力トークンに区切り文字自体を含まない。 しかし、場合によっては出力トークンに区切り文字自体を含んだ方が便利なこともある。 char_separator はその機能をオプションで提供しており、トークンとして出力したい区切り文字は kept delimiters に、出力したくない区切り文字は dropped delimiters に指定すれば良い。

入力文字列中に2つの区切り文字が連続して現れたときは、 空のトークン を出力するか、飛ばして進んでいくかという疑問が発生する。 strtok() は飛ばして進んでいくが、 char_separator クラスはどちらかを選択することができる。

Examples

この最初の例は strtok() 関数の代替としての char_separator の使い方を示している。 区切り文字として3つの文字を指定し、それらの区切り文字は出力トークンの中には含まれない。 また、kept delimiters は指定せず、デフォルトでは空のトークンは無視される。

// char_sep_example_1.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()
{
  std::string str = ";;Hello|world||-foo--bar;yow;baz|";
  typedef boost::tokenizer<boost::char_separator<char> > 
    tokenizer;
  boost::char_separator<char> sep("-;|");
  tokenizer tokens(str, sep);
  for (tokenizer::iterator tok_iter = tokens.begin();
       tok_iter != tokens.end(); ++tok_iter)
    std::cout << "<" << *tok_iter << "> ";
  std::cout << "\n";
  return EXIT_SUCCESS;
}
出力:
<Hello> <world> <foo> <bar> <yow> <baz> 

次の例は dropped delimiters に '-' と ';' の2つを指定し、 kept delimiters に'|'を指定している。さらに、2つの区切り文字が連続したときに 空のトークンを出力するように指定している。

// char_sep_example_2.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()
{
    std::string str = ";;Hello|world||-foo--bar;yow;baz|";
    typedef boost::tokenizer<boost::char_separator<char> > 
        tokenizer;
    boost::char_separator<char> sep("-;", "|", boost::keep_empty_tokens);
    tokenizer tokens(str, sep);
    for (tokenizer::iterator tok_iter = tokens.begin();
         tok_iter != tokens.end(); ++tok_iter)
      std::cout << "<" << *tok_iter << "> ";
    std::cout << "\n";
    return EXIT_SUCCESS;
}
出力:
<> <> <Hello> <|> <world> <|> <> <|> <> <foo> <> <bar> <yow> <baz> <|> <>

最後の例は char_separator のデフォルトコンストラクタを使用して、 句読点とスペースを区切り文字としてトークンに分解する。

// char_sep_example_3.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()
{
   std::string str = "This is,  a test";
   typedef boost::tokenizer<boost::char_separator<char> > Tok;
   boost::char_separator<char> sep; // default constructed
   Tok tok(str, sep);
   for(Tok::iterator tok_iter = tok.begin(); tok_iter != tok.end(); ++tok_iter)
     std::cout << "<" << *tok_iter << "> ";
   std::cout << "\n";
   return EXIT_SUCCESS;
}
出力:
<This> <is> <,> <a> <test> 

Template parameters

パラメータ説明デフォルト
Char トークンの要素の型。通常は char である。  
Traits 文字の型の char_traits char_traits<char>

Model of

Tokenizer Function

Members


explicit char_separator(const Char* dropped_delims,
                        const Char* kept_delims = "",
                        empty_token_policy empty_tokens = drop_empty_tokens)

トークンに分離するための token_iteratortokenizer を生成する際に使用する char_separator を生成する。 dropped_delimskept_delims はそれぞれ、 トークンに分離する際の区切り文字として使用される文字の文字列である。 入力文字列に区切り文字が見つかると常にトークンはそこで終端となり、次からは新しいトークンとなる。 dropped_delims に含まれる区切り文字は出力中にトークンとして現れないのに対し、 kept_delims に含まれる区切り文字はトークンとして現れる。 empty_tokensdrop_empty_tokens である場合は、空のトークンは出力に含まれない。 empty_tokenskeep_empty_tokens である場合は、空のトークンも出力に含まれる。


explicit char_separator()

dropped delimiters の識別には std::isspace() 関数が使用され、 kept delimiters の識別には std::ispunct() 関数が使用される。 また、空のトークンは出力に含まれない。


template <typename InputIterator, typename Token>
bool operator()(InputIterator& next, InputIterator end, Token& tok)

この関数はトークンに分離するために token_iterator から呼び出される。通常は、使用者がこの関数を直接呼び出すことはない。


© Copyright Jeremy Siek and John R. Bandela 2001-2002. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.


Japanese Translation Copyright © 2003 Akihiro Yamasaki
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。