SRM 453.5 DIV 2 Easy
stringstreamの勉強としてid:ororogに教えてもらった問題をやった。
ToolsBox
概要
vectorneedのi番目の要素はi番目の家具を作るのに必要な工具を表す。
need[i]の各工具はスペース" "で区切られている。
全ての家具を作るのに必要な工具の数を答えよ。
rubyとかjavascript、phpだとsplit()使って好きな区切り文字で
文字列分割できるから簡単だけど、CやC++にはそれがないから
stringstreamを使ってやると楽?なのか。
string stream ssにneed[i]を取得して、
string strに、ss >> strでスペースで区切られた文字列を
取りだしていく、というのがおろろぐの言いたかったことなのだろうか?
とりあえずやってみたら詰まったからメモ。
最初に書いたコード
class ToolsBox { public: int countTools(vector <string> need) { stringstream ss; set<string> set; for (int i = 0; i < need.size(); ++i) { ss.str(""); // ストリームバッファクリア ss << need[i]; string str; while (ss) { ss >> str; set.insert(str); } } return set.size(); } };
何か違う。出力しながらデバッグしてみたら2つ目以降のneed[i]が
ストリームバッファに読み込まれていない感じ。
「c++ stringstream クリア」でググったらりんでん記 stringstreamのクリアの仕方 という記事を発見。
どうやら詰まる人は詰まる詰まりどころだったらしい。
ss.clear(stringstream::goodbit);すべし
class ToolsBox { public: int countTools(vector <string> need) { stringstream ss; set<string> set; for (int i = 0; i < need.size(); ++i) { ss.str(""); // ストリームバッファクリア ss.clear(stringstream::goodbit); // 状態フラグをクリア ss << need[i]; string str; while (ss) { ss >> str; set.insert(str); } } return set.size(); } };