C++ stringのsplit関数作ってみた

文字列を分割したい、って言う時にc/c++の場合split関数がありません。boostを入れるなど
ライブラリに頼るのもアリですが、ちょこちょこっと使いたいだけでライブラリ導入するのもアレだし、
てな時は自分で作るほかありません。


Googleで検索すれば先人のインプリメントなさったsplit関数のコード例が多数引っかかるとは
思います。ただ、他の人が書いたコードをそのまま借用するのも問題あるんじゃないか、という
こともあるわけです。
そんな時はやはり自分で作るわけです。自分で作ったコードを組み込む分にはバグがあったとしても
自分が責任を負うわけですから、そういった面では安心。(安心という表現も変だが。)
というわけで私も作ってみました。


以下がコードになります。ダッサイコードだとは思いますが、世間に晒して恥をかくのも勉強のうち。
ですのでツッコミありましたら歓迎です。よろしくお願いします。
(う〜む、我ながらひどいなぁ。スマートさがないですよね)
なお、rubyと同様の結果が得られるように作っております。デリミタへの正規表現の利用は対応してませんが。

#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> split(std::string str, std::string delim) {
  std::vector<std::string> items;
  std::size_t dlm_idx;
  if(str.npos == (dlm_idx = str.find_first_of(delim))) {
    items.push_back(str.substr(0, dlm_idx));
  }
  while(str.npos != (dlm_idx = str.find_first_of(delim))) {
    if(str.npos == str.find_first_not_of(delim)) {
      break;
    }
    items.push_back(str.substr(0, dlm_idx));
    dlm_idx++;
    str = str.erase(0, dlm_idx);
    if(str.npos == str.find_first_of(delim) && "" != str) {
      items.push_back(str);
      break;
    }
  }
  return items;
}

int main(void) {
  std::string str    = "hoge/fuga/piyo";
  std::string delim  = "/";
  std::vector<std::string> result = split(str, delim);

  for(size_t i = 0; i < result.size(); i++ ) {
	std::cout << "item - " << i << " : " << result[i] << std::endl;
  }

  return 1;
}


結果

item - 0 : hoge
item - 1 : fuga
item - 2 : piyo