C++で文字列のsplit

つい最近、C++の文字列splitが必要な場面がありました。 いい加減C++のsplitを毎回書くのが面倒になってきましたので、忘れないようにメモっておきたいと思います。

C++でsplitを書く方法はいくらでも方法があると思いますが、代表的な実装例をあげてみます。 boostが使える環境であれば一番最初の選択肢としてboostのstring algorithmを利用した方が車輪の再発明をしなくて済むかと思います。 ただ、競技プログラミングなどでは残念ながら利用できません。

  1. find_first_ofを利用する方法 [gist id=734970 bump=1] 利点: 多分一番シンプルで高速? 欠点: デリミタが1文字という制限がある。
  2. findを利用する方法 [gist id=735066 bump=1] 利点: デリミタが複数文字も許容 欠点: 1より若干遅い
  3. stringstreamを利用する方法 [gist id=735070 bump=1] 利点: 記述がシンプル 欠点: デリミタが1文字の制限 感想: 一から書くのならやっぱこれかなぁ・・・
  4. copyとisteam_iterator, back_inserterを利用する方法 [gist id=735072 bump=1] 利点: 記述がシンプル 欠点: スペースや改行タブといったいわゆるホワイトスペースでしかsplitできない 感想: この記述を初めて見た時にSTLのすごさというかこんなことできるの?と驚いたのを覚えています。 こういったところがC++のいいところというか、面白いところですね。
  5. boost::algorithm::splitを利用する方法 [gist id=735073 bump=1] 利点: 準標準ライブラリ, デリミタは関数オブジェクトで指定できるため非常に柔軟な指定が可能 欠点: デリミタは1文字の制限がある?
  6. strtok()を利用する方法(コード例なし) 利点: 一番高速? 欠点: C言語的, 破壊的な操作, 安全性などに難あり, static変数を持つのでマルチスレッド対応されていない(strtok_rがあることはあるが)

これら関数の動作サンプルはgithubにあげています。

ちょっとC++の話題ばかりになってしまったので、今度は別のネタを書きたいと思います・・・。