SRM302 div2 medium

mapを使うと効率がよい。
あとは、placeboardを変形してそのままreturnにしたいので、あまり関係のない処理はしたくない。例えば、John-PBとかになったときに、-をどうして処理するかとか。
>||-||<をたとえば、空白に置き換えるとスムーズにできそうではあるが、その後に戻さなければならず、結構めんどくさい。
そこで部分文字列を使ってみた。

class XBallGame {
	public:
	vector  newStatistics(vector  placeboard) {
		int sz = placeboard.size();
		map > table;
		vector > board(sz);
		for(int i = 0; i < sz; i++) {
			int pos = placeboard[i].find('-');
			string name = placeboard[i].substr(0, pos);
			string position = placeboard[i].substr(pos+1);
			table[name].insert(position);
			board[i].first = name; board[i].second = position;
		}
		for(int i = 0; i < sz; i++) {
			set pos = table[board[i].first];
			set::iterator it;
			for(it = pos.begin(); it != pos.end(); it++) {
				if(*it != board[i].second) {
					placeboard[i] += ',' + (*it);
				}
			}
		}
		return placeboard;
		
	}


出力系のぶぶんはgetlineを使っても割と簡単にかける。

string tmp[2]; int j = 0;
string str;
istringstream iss(placeboard[i]);
while( getline(iss, str, '-') ) {
	tmp[j] = str; j++;
}
//こうしてもうまくいかない.
    for(int i = 0; i < sz; i++) {
      char name[22], position[3];
      sscanf(placeboard[i].c_str(), "%s-%s", name, position);
//sscabf(placeboard[i].c_str(), "%s-%s", &name, &position); もだめ。
      board[i].first = string(name); board[i].second = string(position);
      table[string(name)].insert(string(position));
      cout << name <<"::"<< position << endl;
    }
//こうすればうまく取り込めるが、nameが何文字が分からないので、使えない.
    for(int i = 0; i < sz; i++) {
      char name[22], position[3];
      sscanf(placeboard[i].c_str(), "%4s-%4s", name, position);
    }
//どうしてもsscanfを使いたいのであれば、%[A-Z]という風にするとよい。
ただし、範囲文字列指定"-"はANSI Cの標準ではない。反転^は標準みたい.
http://d.hatena.ne.jp/kenta11626918/20110412/1302619244
char name[22], position[3];
sscanf(placeboard[i].c_str(), "%[A-za-z]-%[A-Z]", name, position);
//ただ、こうかく人はほとんどいないだろうね。