とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

splice, std::list

STL―標準テンプレートライブラリによるC++プログラミング 第2版

// P152 ex06-12.cpp
#include<string>
template<typename Container>
typename Container make(const char* s){
 const std::string str(s);
 return Container(str.begin(), str.end());
}
#include<iostream>
#include<list>
#include<algorithm>
#include<cassert>
int main(){
 using std::cout;
 using std::endl;
 using std::list;
 using std::find;
 using std::search;
 cout << "Demonstrating STL splice functions." << endl;
 { // list1.splice(iterator1, list2) list2 全部を list1 へ
  list<char> l1(make<list<char>>("There is something about science.")),
   l2(make<list<char>>("fascinating "));
  l1.splice(find(l1.begin(), l1.end(), 'a'), l2);
  assert(l1 ==
   make<list<char>>("There is something fascinating about science."));
  assert(l2.empty());
 }
 { // list1.splice(iterator1, list2, iterator2) iterator2 の先の要素を list1 へ
  list<char> l1(make<list<char>>("One gets such wholesale return of conjecture")),
   l2(make<list<char>>("out of ssuch a trifling investment of fact.")),
   l3(make<list<char>>(" of"));
  list<char>::const_iterator i =
   search(l1.begin(), l1.end(), l3.begin(), l3.end()),
   j = find(l2.begin(), l2.end(), 's');
  // l1 の " of" の直前に,l2 の 's' をつなぎかえる
  l1.splice(i, l2, j);
  assert(l1 == make<list<char>>("One gets such wholesale returns of conjecture"));
  assert(l2 == make<list<char>>("out of such a trifling investment of fact."));
 }
 { // list1.splice(iterator1, list2, iterator2begin, iterator2end) list2 の範囲を list1 へ
  list<char> l1(make<list<char>>("Mark Twain")),
   l2(make<list<char>>(" --- "));
  list<char>::iterator j = find(l2.begin(), l2.end(), ' '),
   k = find(++j, l2.end(), ' ');
  l1.splice(l1.begin(), l2, j, k);
  assert(l1 == make<list<char>>("---Mark Twain"));
  assert(l2 == make<list<char>>("  "));
 }
}