PEEE802.11

モバイルソフトウェアエンジニアの備忘録

C++でBoost使わずに文字列を分解する

boost::splitを使うと文字列をデリミタで分解してコンテナに格納することができるのだけど、boostが無い環境で同等の機能が欲しくなったので書いてみた。find_first_of()とsubstr()を使う。

void split(std::vector<std::string> &v, const std::string &input_string, const std::string &delimiter)
{
  std::string::size_type index = input_string.find_first_of(delimiter);

  if (index != std::string::npos) {
    v.push_back(input_string.substr(0, index));
    split(v, input_string.substr(index + 1), delimiter);
  } else {
    v.push_back(input_string);
  }
}

int main(int argc, const char * argv[])
{
  std::string input_string, delimiter;
  std::vector<std::string> v;

  std::cout << "input string to split: ";
  std::cin >> input_string;

  std::cout << "specify delimiter: ";
  std::cin >> delimiter;

  split(v, input_string, delimiter);

  for (auto &s : v) {
    std::cout << s << std::endl;
  }

  return 0;
}


結果

input string to split: first,second,third,forth
specify delimiter: ,
first
second
third
forth


再帰で割りとシンプルに書けた。

追記 2014.10

実はのstd::getline()で普通にデリミタ指定ができる模様。無知を恥じます。


getlineはsplitに使える - Faith and Brave - C++で遊ぼう