TLTR
1 2 3 4 5 |
vector<string> vs = { "aaa", "bbb", "ccc" }; ostringstream oss; std::copy(vs.begin(), vs.end(), ostream_iterator<string>(oss, " ")); |
ostringstreamとは
<<で渡された値を内部に持っているstringに追加していく。
1 2 3 4 5 6 7 8 9 10 |
ostringstream oss; oss << 1 ; oss << 10 << "\n"; oss << 100 << "\n"; oss << "xxx" << "\n"; oss << "yyy" << "\n"; oss << "zzz" << "\n"; cout << oss.str() << endl; |
ostream_iteratorとは
=で渡された値をコンストラクタで渡された出力ストリームに追加していく。
コンストラクタの2番めの引数はデリミタを指定する。=でストリームに追加したあとにこの値も追加する。デフォルトでは何も追加しない。
++演算では何もしない。これにより下記のcopyで役に立つ。
1 2 3 4 5 6 7 8 9 10 11 12 |
{ ostream_iterator<int> osi(cout, "\n"); osi = 1; osi = 2; osi = 3; } { ostream_iterator<string> osi(cout, "\n"); osi = "osstest1"; osi = "osstest2"; osi = "osstest3"; } |
上のコードは以下のようにコンソールに出力される。
1 2 3 4 5 6 |
1 2 3 osstest1 osstest2 osstest3 |
copyとは
第一引数と第二引数のイテレータで入力範囲を指定する。
第三引数で出力イテレータを指定する。
入力出力とも++で一個ずつずらしていって=でコピーする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ vector<int> vi = { 1, 2, 3 }; vector<int> vi2(3); copy(vi.begin(), vi.end(), vi2.begin()); } { vector<string> vs = { "a", "b", "c" }; vector<string> vs2(3); copy(vs.begin(), vs.end(), vs2.begin()); } |
ostream_iteratorの++は何もしないで=で値をストリームに追加する。(最初のコード参照)