SRM 453.5 DIV 2 Easy

stringstreamの勉強としてid:ororogに教えてもらった問題をやった。

ToolsBox
概要


vector needのi番目の要素はi番目の家具を作るのに必要な工具を表す。
need[i]の各工具はスペース" "で区切られている。
全ての家具を作るのに必要な工具の数を答えよ。

rubyとかjavascriptphpだと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();
    }
};