stl sample

// copy()を使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v(10);
  vector< char> v2(10);
  int i;

  for(i=0; i<10; i++) v[i] = 'A'+i;
  for(i=0; i<10; i++) v2[i] = 'z';

  // vのすべての要素をv2にコピーする
  copy(v.begin(), v.end(), v2.begin());

  cout << "Contents of v2 after complete copy:\n";
  for(i=0; i<10; i++)
    cout << v2[i] << " ";
  cout << "\n\n";

  // v2を再び初期化する
  for(i=0; i<10; i++) v2[i] = 'z';

  // vの一部をv2にコピーする
  copy(v.begin()+2, v.end()-2, v2.begin());

  cout << "Contents of v2 after subsequence copy:\n";
  for(i=0; i<10; i++)
    cout << v2[i] << " ";
  cout << "\n\n";

  // v2を再び初期化する
  for(i=0; i<10; i++) v2[i] = 'z';

  // vの一部をv2の中間にコピーする
  copy(v.begin()+2, v.end()-2, v2.begin()+3);

  cout << "Contents of v2 after copy into middle:\n";
  for(i=0; i<10; i++)
    cout << v2[i] << " ";
  cout << "\n\n";

  return 0;
}

// swap_ranges()を使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v(10);
  vector< char> v2(10);
  int i;

  for(i=0; i<10; i++) v[i] = 'A'+i;
  for(i=0; i<10; i++) v2[i] = '0' + i;

  cout << "Original contents of v:\n";
  for(i=0; i<10; i++)
    cout << v[i] << " ";
  cout << "\n";
  cout << "Original contents of v2:\n";
  for(i=0; i<10; i++)
    cout << v2[i] << " ";
  cout << "\n\n";

  // vとv2の範囲を交換する
  swap_ranges(v.begin()+2, v.end()-3, v2.begin()+4);

  cout << "Contents of v after swap:\n";
  for(i=0; i<10; i++)
    cout << v[i] << " ";
  cout << "\n";
  cout << "Contents of v2 after swap:\n";
  for(i=0; i<10; i++)
    cout << v2[i] << " ";
  cout << "\n";

  return 0;
}


// find()とfind_if()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstring>
using namespace std;

// chがカンマならtrueを返す
bool iscomma(char ch)
{
  if(ch==',') return true;
  return false;
}

int main()
{
  vector< char> v;
  vector< char>::iterator p;
  char str[] = "One, Two, Three";
  int i;

  for(i=0; i< strlen(str); i++)
    v.push_back(str[i]);

  cout << "Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i];
  cout << endl;

  // find the first T
  p = find(v.begin(), v.end(), 'T');
  cout << "Sequence beginning with T: ";
  while(p != v.end())
    cout << *p++;
  cout << endl;

  // 最初のカンマを探す
  p = find_if(v.begin(), v.end(), iscomma);
  cout << "After find first comma: ";
  while(p != v.end())
    cout << *p++;
  cout << endl;

  return 0;
}

// search()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstring>
using namespace std;

int main()
{
  vector< char> v, v2;
  vector< char>::iterator p;
  char str1[] = "One, Two, Three, Two again";
  char str2[] = "Two";
  int i;

  for(i=0; i< strlen(str1); i++)
    v.push_back(str1[i]);

  for(i=0; i< strlen(str2); i++)
    v2.push_back(str2[i]);

  cout << "Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i];
  cout << endl;

  // 最初の"Two"を探す
  p = search(v.begin(), v.end(), v2.begin(), v2.end());
  cout << "Sequence beginning with Two: ";
  while(p != v.end())
    cout << *p++;
  cout << endl;

  return 0;
}

// mismatch()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstring>
#include < utility>
using namespace std;

int main()
{
  vector< char> v, v2;
  pair< vector< char>::iterator, vector< char>::iterator> p;
  char str1[] = "One, Two, Three, Two again";
  char str2[] = "One, Two, Four, Five, Nine";
  int i;

  for(i=0; i< strlen(str1); i++)
    v.push_back(str1[i]);

  for(i=0; i< strlen(str2); i++)
    v2.push_back(str2[i]);

  cout << "Contents of v:  ";
  for(i=0; i< v.size(); i++)
    cout << v[i];
  cout << endl;

  cout << "Contents of v2: ";
  for(i=0; i< v2.size(); i++)
    cout << v2[i];
  cout << endl;

  // 最初の相違を探す
  p = mismatch(v.begin(), v.end(), v2.begin());

  if(p.first != v.end()) { // mismatch found
    cout << "The character " << *p.first;
    cout << " in v mismatches the character ";
    cout << *p.second << " in v2.\n";
  }

  return 0;
}

// sort()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

void init_v(vector< int> &v)
{
  v[0] = 99;
  v[1] = 5;
  v[2] = 109;
  v[3] = -3;
  v[4] = 44;
  v[5] = 10;
  v[6] = 108;
  v[7] = 7;
  v[8] = 11;
  v[9] = 76;
}

int main()
{
  vector< int> v(10);
  int i;

  // コンテナのすべての要素をソートする
  init_v(v); // vを初期化する

  cout << "Sort an entire container.\n";
  cout << "Original order:\n";
  for(i=0; i<10; i++) 
    cout << v[i] << " ";
  cout << "\n";

  sort(v.begin(), v.end());

  cout << "Order after sorting container:\n";
  for(i=0; i<10; i++) 
    cout << v[i] << " ";
  cout << "\n\n";

  // コンテナの一部をソートする
  init_v(v); // vを再初期化する

  cout << "Sort a subset of a container.\n";
  cout << "Original order:\n";
  for(i=0; i<10; i++) 
    cout << v[i] << " ";
  cout << "\n";

  sort(v.begin()+2, v.end()-2);

  cout << "Order after sorting v[2] through v[7]:\n";
  for(i=0; i<10; i++) 
    cout << v[i] << " ";
  cout << "\n\n";

  return 0;
}

// partial_sort()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

void init_v(vector< int> &v)
{
  v[0] = 99;
  v[1] = 5;
  v[2] = 109;
  v[3] = -3;
  v[4] = 44;
  v[5] = 10;
  v[6] = 108;
  v[7] = 7;
  v[8] = 11;
  v[9] = 76;
}

int main()
{
  vector< int> v(10);
  int i;

  init_v(v); // vを初期化する

  cout << "Original order:\n";
  for(i=0; i<10; i++) 
    cout << v[i] << " ";
  cout << "\n";

  partial_sort(v.begin(), v.begin()+5, v.end());

  cout << "Order after partial sorting:\n";
  for(i=0; i<10; i++) 
    cout << v[i] << " ";
  cout << "\n";

  return 0;
}

// binary_search()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
  vector< char> v;
  bool result;
  int i;

  for(i=0; i<10; i++)
    v.push_back('A' + i);

  cout << "Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i];
  cout << endl;

  // Fを検索する
  cout << "Looking for F.\n";
  result = binary_search(v.begin(), v.end(), 'F');
  if(result)
    cout << "F Found\n";
  else
    cout << "F Not Found\n";

  // Xを検索する
  cout << "Looking for X.\n";
  result = binary_search(v.begin(), v.end(), 'X');
  if(result)
    cout << "X Found\n";
  else
    cout << "X Not Found\n";

  return 0;
} 

// lower_bound()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
  vector< char> v;
  vector< char>::iterator p;
  int i;

  for(i=0; i<10; i++)
    v.push_back('A' + i);

  cout << "Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i];
  cout << endl;

  // Fを検索する
  cout << "Looking for F.\n";
  p = lower_bound(v.begin(), v.end(), 'F');
  if(p != v.end())
    cout << *p << " Found\n";
  else
    cout << "F Not Found\n";

  // Xを検索する
  cout << "Looking for X.\n";
  p = lower_bound(v.begin(), v.end(), 'X');
  if(p != v.end())
    cout << *p << " Found\n";
  else
    cout << "X Not Found\n";

  return 0;
}

// remove()とreplace()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v;
  vector< char>::iterator p, p_end;
  int i;

  for(i=0; i<5; i++) {
    v.push_back('A'+i);
    v.push_back('A'+i);
    v.push_back('A'+i);
  }

  cout << "Original contents of v:\n";
  for(p=v.begin(); p< v.end(); p++)
    cout << *p << " ";
  cout << endl;

  // すべての"C"を削除する
  p_end = remove(v.begin(), v.end(), 'C');

  cout << "Sequence after removing all C's:\n";
  for(p=v.begin(); p< p_end; p++)
    cout << *p << " ";
  cout << endl;

  // "D"を"X"に置換する
  replace(v.begin(), v.end(), 'D', 'X');

  cout << "Sequence after replacement:\n";
  for(p=v.begin(); p< p_end; p++)
    cout << *p << " ";
  cout << endl;

  return 0;
}

// unique()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v;
  vector< char>::iterator p, p_end;
  int i;

  for(i=0; i<5; i++) {
    v.push_back('A'+i);
    v.push_back('A'+i);
    v.push_back('A'+i);
  }

  cout << "Original contents of v:\n";
  for(p=v.begin(); p< v.end(); p++)
    cout << *p << " ";
  cout << endl;

  // 重複要素を削除する
  p_end = unique(v.begin(), v.end());

  cout << "Sequence after removing duplicates:\n";
  for(p=v.begin(); p< p_end; p++)
    cout << *p << " ";
  cout << endl;

  return 0;
}

// シーケンスの変換
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

double midpoint(double a, double b)
{
  return ((a-b) / 2) + b;
}

int main()
{
  vector< double> v1(5), v2(5), v3(5);
  int i;

  v1[0] = 10.0;
  v1[1] = 98.6;
  v1[2] = 12.23;
  v1[3] = 88.8;
  v1[4] = -212.01;

  v2[0] = 2.0;
  v2[1] = 3.3;
  v2[2] = 4.19;
  v2[3] = 155.0;
  v2[4] = -2.0;

  cout << "Values in v1: ";
  for(i=0; i< v1.size(); i++)
    cout << v1[i] << " ";
  cout << endl;

  cout << "Values in v2: ";
  for(i=0; i< v2.size(); i++)
    cout << v2[i] << " ";
  cout << endl;

  // v1の要素とv2の要素の中点を見つける
  transform(v1.begin(), v1.end(), v2.begin(),
            v3.begin(), midpoint);

  // 中点
  cout << "Midpoints: ";
  for(i=0; i< v3.size(); i++)
    cout << v3[i] << " ";

  return 0;
}

// シーケンスの生成
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

// 簡単な生成関数
double f()
{
  static double val = 1.0;
  double t;

  t = 1.0 / val;
  val += val;

  return t;
}

int main()
{
  vector< double> v(5);
  int i;

  // 数列を生成する
  generate(v.begin(), v.end(), f);

  cout << "Series: ";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";

  return 0;
}

// シーケンスを回転する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< int> v;
  vector< int>::iterator p;
  int i;
  
  for(i=0; i<10; i++) v.push_back(i);

  cout << "Original ordering: ";
  for(p=v.begin(); p< v.end(); p++)
    cout << *p << " ";
  cout << endl;

  // 左方向に1つ回転する
  rotate(v.begin(), v.begin()+1, v.end());

  cout << "Order after left rotate: ";
  for(p=v.begin(); p< v.end(); p++)
    cout << *p << " ";
  cout << endl;

  return 0;
}

// シーケンスを右方向に回転する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< int> v;
  vector< int>::iterator p;
  int i;
  
  for(i=0; i<10; i++) v.push_back(i);

  cout << "Original ordering: ";
  for(p=v.begin(); p< v.end(); p++)
    cout << *p << " ";
  cout << endl;

  // 逆方向反復子を使って右方向に2つ回転する
  rotate(v.rbegin(), v.rbegin()+2, v.rend());

  cout << "Order after two right rotates: ";
  for(p=v.begin(); p< v.end(); p++)
    cout << *p << " ";
  cout << endl;

  return 0;
}


// random_shuffle()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v;
  int i;

  for(i=0; i<26; i++) v.push_back('A'+i);

  cout << "Original contents of v:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i];
  cout << "\n\n";

  random_shuffle(v.begin(), v.end());

  cout << "Shuffled contents of v:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i];

  return 0;
}

// 2つのシーケンスをマージする
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v1, v2, v3(26);
  int i;

  for(i=0; i<26; i+=2) v1.push_back('A'+i);
  for(i=0; i<26; i+=2) v2.push_back('B'+i);

  cout << "Original contents of v1:\n";
  for(i=0; i< v1.size(); i++)
    cout << v1[i];
  cout << "\n\n";

  cout << "Original contents of v2:\n";
  for(i=0; i< v2.size(); i++)
    cout << v2[i];
  cout << "\n\n";

  // シーケンスをマージする
  merge(v1.begin(), v1.end(),
        v2.begin(), v2.end(),
        v3.begin());

  cout << "Result of merge:\n";
  for(i=0; i< v3.size(); i++)
    cout << v3[i];

  return 0;
}

// 同一シーケンス内でマージを行う
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v1;
  int i;

  for(i=0; i<26; i+=2) v1.push_back('A'+i);
  for(i=0; i<26; i+=2) v1.push_back('B'+i);

  cout << "Original contents of v1:\n";
  for(i=0; i< v1.size(); i++)
    cout << v1[i];
  cout << "\n\n";

  // v1内の2つの範囲をマージする
  inplace_merge(v1.begin(), v1.begin()+13, v1.end());

  cout << "Result of merge:\n";
  for(i=0; i< v1.size(); i++)
    cout << v1[i];

  return 0;
}

// 集合アルゴリズムの使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v1, v2, v_res(26), v3;
  vector< char>::iterator p, pres_end;
  int i;

  for(i=0; i<20; i++) v1.push_back('A'+i);
  for(i=10; i<26; i++) v2.push_back('A'+i);

  cout << "Contents of v1:\n";
  for(i=0; i< v1.size(); i++)
    cout << v1[i];
  cout << "\n";

  cout << "Contents of v2:\n";
  for(i=0; i< v2.size(); i++)
    cout << v2[i];
  cout << "\n\n";

  // 和
  pres_end = set_union(v1.begin(), v1.end(),
                 v2.begin(), v2.end(),
                 v_res.begin());

  cout << "Set union: ";
  for(p=v_res.begin(); p!=pres_end; p++)
    cout << *p;
  cout << "\n\n";

  // 差
  pres_end = set_difference(v1.begin(), v1.end(),
                 v2.begin(), v2.end(),
                 v_res.begin());

  cout << "Set difference: ";
  for(p=v_res.begin(); p!=pres_end; p++)
    cout << *p;
  cout << "\n\n";

  // 対称差
  pres_end = set_symmetric_difference(v1.begin(), v1.end(),
                 v2.begin(), v2.end(),
                 v_res.begin());

  cout << "Set symmetric difference: ";
  for(p=v_res.begin(); p!=pres_end; p++)
    cout << *p;
  cout << "\n\n";

  // 交差
  pres_end = set_intersection(v1.begin(), v1.end(),
                 v2.begin(), v2.end(),
                 v_res.begin());

  cout << "Set intersection: ";
  for(p=v_res.begin(); p!=pres_end; p++)
    cout << *p;
  cout << "\n\n";

  // 包含
  v3.push_back('A');
  v3.push_back('C');
  v3.push_back('D');

  // 以下の4行は監修者による追加
  cout << "Contents of v3: \n";
  for(i=0; i< v3.size(); i++)
    cout << v3[i];
  cout << "\n\n";

  if(includes(v1.begin(), v1.end(),
              v3.begin(), v3.end()))
    cout << "v1 includes all of v3\n";
  else
    cout << "v3 contains elements not found in v1\n";

  return 0;
}

// 順列を作成する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v;
  int i;

  for(i=0; i<3; i++) v.push_back('A'+i);

  cout << "All permutations of 3 characters:\n";

  do {
    for(i=0; i< v.size(); i++)
      cout << v[i];
    cout << "\n";
  } while(next_permutation(v.begin(), v.end()));

  return 0;
}

// 順列を作成する
#include 
#include 
#include 
using namespace std;

int main()
{
  vector v;
  int i;

  for(i=0; i<3; i++) v.push_back('A'+i);

  cout << "3文字の順列をすべて挙げると:\n";

  do {
    for(i=0; i< v.size(); i++)
      cout >< v[i];
    cout << "\n";
  } while(next_permutation(v.begin(), v.end()));

  return 0;
}

// ヒープを使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< char> v;
  int i;

  for(i=0; i<20; i+=2) v.push_back('A'+i);

  cout << "Sequence before building heap:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n\n";

  // ヒープを構築する
  make_heap(v.begin(), v.end());

  cout << "Sequence after building heap:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n\n";

  // ヒープに"H"をプッシュする
  v.push_back('H'); // まず、ベクタにHを挿入する
  push_heap(v.begin(), v.end()); // 次に、Hをヒープにプッシュする

  cout << "Sequence after pushing onto heap:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n\n";

  // ヒープから値をポップする
  pop_heap(v.begin(), v.end());

  cout << "Sequence after poping from heap:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n\n";

  return 0;
}


// 最小値と最大値を探す
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

int main()
{
  vector< int> v(5);
  int i;

  v[0] = 100;
  v[1] = -4;
  v[2] = 55;
  v[3] = 19;
  v[4] = 122;

  cout << "Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n\n";

  cout << "Maximum element is: ";
  cout << *max_element(v.begin(), v.end());
  cout << "\n";

  cout << "Minimum element is: ";
  cout << *min_element(v.begin(), v.end());

  return 0;
}


#include 
#include 
using namespace std;

int main()
{
  vector v;
  int i;

  for(i=0; i<10; i++) v.push_back(i);

  cout << "Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout >< v[i] << " ";
  cout << "\n";

  return 0;
}


// for_each()を使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;

void show(int i)
{
  cout << i << " ";
}

int main()
{
  vector< int> v;
  int i;

  for(i=0; i<10; i++) v.push_back(i);

  cout << "Contents of v: ";
  for_each(v.begin(), v.end(), show);
  cout << "\n";

  return 0;
}


// 独自のアルゴリズムを作成する
#include < iostream>
#include < vector>
#include < list>
#include < algorithm>
using namespace std;

// 特定の範囲の値を2倍にするアルゴリズム
template< class ForIter>
  void times2(ForIter start, ForIter end)
{
  while(start != end) {
    *start *= 2;
    start++;
  }
}

int main()
{
  int i;

  //**************************************
  // intのベクタにtimes2を適用する
  vector< int> v;

  for(i=0; i<10; i++) v.push_back(i);

  cout << "Initial Contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n";

  times2(v.begin(), v.end());

  cout << "Contents of v doubled: ";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n\n";

  //**************************************
  // floatのリストにtimes2を適用する
  list< float> lst;
  list< float>::iterator p;

  for(i=0; i<5; i++) lst.push_back((float)i*3.1416);

  cout << "Initial Contents of lst: ";
  for(p=lst.begin(); p!=lst.end(); p++)
    cout << *p << " ";
  cout << "\n";

  times2(lst.begin(), lst.end());

  cout << "Contents of lst doubled: ";
  for(p=lst.begin(); p!=lst.end(); p++)
    cout << *p << " ";
  cout << "\n\n";

  return 0;
}

1