stl sample

// vectorの使用例
#include < iostream>
#include < vector>
using namespace std;

int main()
{
  vector< int> v(10); // 長さ10のベクタを作成する
  int i;

  // vの元の大きさを表示する
  cout << "Size = " << v.size() << endl;

  // ベクタの各要素に値を代入する
  for(i=0; i< 10; i++) v[i] = i;

  // ベクタの要素を表示する
  cout << "Current Contents:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";
  cout << "\n\n";

  cout << "Expanding vector\n";
  // ベクタの最後に値を追加すると、ベクタは必要に応じて拡大する
  for(i=0; i< 5; i++) v.push_back(i + 10);

  //  の現在の大きさを表示する
  cout << "Size now = " << v.size() << endl;

  // ベクタの要素を表示する
  cout << "Current contents:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";
  cout << "\n\n";

  // ベクタの要素を変更する
  for(i=0; i< v.size(); i++) v[i] = -v[i];

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

  return 0;
}


// pop_back()とempty()を使用する
#include < iostream>
#include < vector>
using namespace std;

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

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

  cout << "Vector's original contents:\n";
  for(i=0; i < v.size(); i++)
    cout << v[i] << " ";

  cout << "\n\n";

  do {
    v.pop_back(); // 末尾から要素を削除する

    cout << "Vector now contains:\n";
    for(i=0; i < v.size(); i++)
      cout << v[i] << " ";
    cout << endl;

  } while(!v.empty());

  return 0;
}

// 反復子を介してベクタの要素にアクセスする
#include < iostream>
#include < vector>
using namespace std;

int main()
{
  vector< int> v(10); // 長さ10のベクタを作成する
  vector< int>::iterator p; // 反復子を作成する
  int i;

  // ベクタの要素に値を代入する
  p = v.begin();
  i = 0;
  while(p != v.end()) {
    *p = i; // pを介してvにiを書き込む
    p++; // 反復子を進める
    i++;
  }

  // ベクタの要素を表示する
  cout << "Original contents:\n";
  p = v.begin();
  while(p != v.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  // ベクタの要素を変更する
  p = v.begin();
  while(p != v.end()) {
    *p = *p * 2;
    p++;
  }

  // ベクタの要素を表示する
  cout << "Modified Contents:\n";
  p = v.begin();
  while(p != v.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;

  return 0;
}

// end()を理解する
#include < iostream>
#include < vector>
using namespace std;

int main()
{
  vector< int> v; // 空のベクタを作成する
  int i;

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

  cout << "Vector printed forwards:\n";
  vector< int>::iterator p = v.begin();
  while(p != v.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  cout << "Vector printed backwards:\n";
  p = v.end();
  while(p != v.begin()) {
    p--; // 使用する前に反復子をデクリメントする
    cout << *p << " ";
  }

  return 0;
}

// 挿入と削除の例
#include < iostream>
#include < vector>
using namespace std;

int main()
{
  vector< char> v(10);
  vector< char> v2;
  char str[] = "< Vector>";
  int i;

  // vを初期化する
  for(i=0; i<10; i++) v[i] = i + 'a';

  // str内の文字をv2にコピーする
  for(i=0; str[i]; i++) v2.push_back(str[i]);
  
  // ベクタの元の内容を表示する
  cout << "Original contents of v:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";
  cout << "\n\n";

  vector< char>::iterator p = v.begin();
  p += 2; // 3番目の要素を指す

  // vに10個のXを挿入する
  v.insert(p, 10, 'X');

  // 挿入後の要素を表示する
  cout << "Size after inserting X's = " << v.size() << endl;
  cout << "Contents after insert:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";
  cout << "\n\n";

  // これらの要素を削除する
  p = v.begin();
  p += 2; // 3番目の要素を指す
  v.erase(p, p+10); // 次の10個の要素を削除する

  // 削除後の要素を表示する
  cout << "Size after erase = " << v.size() << endl;
  cout << "Contents after erase:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";
  cout << "\n\n";

  // v2をvに挿入する
  v.insert(p, v2.begin(), v2.end());
  cout << "Size after v2's insertion = ";
  cout << v.size() << endl;
  cout << "Contents after insert:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";
  cout << endl;

  return 0;
}

// listを使用する
#include < iostream>
#include < list>
using namespace std;

int main()
{
  list< int> lst; // 空のlistを作成する
  int i;

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

  cout << "Size = " << lst.size() << endl;

  cout << "Contents: ";
  list< int>::iterator p = lst.begin();
  while(p != lst.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  // listの要素を変更する
  p = lst.begin();
  while(p != lst.end()) {
    *p = *p + 100;
    p++;
  }

  cout << "Contents modified: ";
  p = lst.begin();
  while(p != lst.end()) {
    cout << *p << " ";
    p++;
  }

  return 0;
}

// リストの結合とマージを行う
#include < iostream>
#include < list>
using namespace std;

int main()
{
  list< char> lst1, lst2, lst3;
  int i;

  for(i=0; i<10; i+=2) lst1.push_back(i + 'A');
  for(i=1; i<11; i+=2) lst2.push_back(i + 'A');

  cout << "Contents of lst1:\n";
  list< char>::iterator p = lst1.begin();
  while(p != lst1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  cout << "Contents of lst2:\n";
  p = lst2.begin();
  while(p != lst2.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  // 2つのリストをマージする
  lst1.merge(lst2);
  if(lst2.empty())
    cout << "lst2 is now empty\n";

  cout << "Contents of lst1 after merge:\n";
  p = lst1.begin();
  while(p != lst1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  // push_front()を使ってほかのリストを作成する
  char str[] = "-splicing-";
  for(i=0; str[i]; i++) lst3.push_back(str[i]);

  cout << "Contents of lst3:\n";
  p = lst3.begin();
  while(p != lst3.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  // 2つのリストを結合する
  p = lst1.begin();
  while(p != lst1.end()) {
    if(*p == 'F') lst1.splice(p, lst3);
    p++;
  }

  cout << "Contents of lst1 after splice:\n";
  p = lst1.begin();
  while(p != lst1.end()) {
    cout << *p << " ";
    p++;
  }

  return 0;
}

// push_back()とpush_front()の違いを示すコード
#include < iostream>
#include < list>
using namespace std;

int main()
{
  list< int> lst1, lst2;
  int i;

  for(i=0; i<10; i++) lst1.push_back(i);
  for(i=0; i<10; i++) lst2.push_front(i);
  
  list< int>::iterator p;
  
  cout << "Contents of lst1:\n";
  p = lst1.begin();  
  while(p != lst1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";

  cout << "Contents of lst2:\n";
  p = lst2.begin();  
  while(p != lst2.end()) {
    cout << *p << " ";
    p++;
  }
    
  return 0;
}

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

int main()
{
  vector< bool> v;
  int i;
  
  for(i=0; i < 10; i++) {
   if(rand() % 2) v.push_back(true);
   else v.push_back(false);
  }

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

  i = count(v.begin(), v.end(), true);
  cout << i << " elements are true.\n";

  return 0;
}

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

// 数が偶数かどうかを判定する単項述語
bool isEven(int i) 
{
  return !(i%2);

  return false;
}

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

  for(i=1; i < 20; i++) v.push_back(i);

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

  i = count_if(v.begin(), v.end(), isEven);
  cout << i << " numbers are evenly divisible by 2.\n";

  return 0;
}

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

int main()
{
  char str[]="Algorithms operate on containers through iterators.";
  vector< char> v, v2(100); 
  vector< char>::iterator p;
  int i;

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

  // **** remove_copy()の例 ****
  cout << "Input sequence:\n";
  for(i=0; i< v.size(); i++) cout << v[i];
  cout << endl;

  // すべての空白文字を削除する
  p = remove_copy(v.begin(), v.end(), v2.begin(), ' ');

  cout << "Result after removing spaces:\n";
  for(i=0; i< p-v2.begin(); i++) cout << v2[i];
  cout << "\n\n";

  // **** replace_copy()の例 ****
  cout << "Input sequence:\n";
  for(i=0; i< v.size(); i++) cout << v[i];
  cout << endl;

  // 空白文字を+記号に置換する
  p = replace_copy(v.begin(), v.end(), v2.begin(), ' ', '+');

  cout << "Result after replacing spaces with +'s:\n";
  for(i=0; i< p-v2.begin(); i++) cout << v2[i];
  cout << "\n\n";

  return 0;
}

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

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

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

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

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

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

  return 0;
}

// 変換アルゴリズムの例
#include < iostream>
#include < list>
#include < algorithm>
using namespace std;

// 簡単な変換関数
double reciprocal(double i) {
  return 1.0/i; // 逆数を返す
}

int main()
{
  list< double> vals;
  int i;

  // リストに値を入れる
  for(i=1; i<10; i++) vals.push_back((double)i);

  cout << "Original contents of vals:\n";
  list< double>::iterator p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }

  cout << endl;
 
  // 値の変換
  p = transform(vals.begin(), vals.end(),
                vals.begin(), reciprocal);

  cout << "Transformed contents of vals:\n";
  p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }

  return 0;
}


// リストをベクタにコピーする
#include < iostream>
#include < vector>
#include < list>
#include < algorithm>
using namespace std;

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

  // ベクタを初期化する
  for(i=0; i<20; i++) v[i] = 'A' + i;

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

  // リストを初期化する
  char str[] = "-STL Power-";
  for(i = 0; str[i]; i++) lst.push_back(str[i]);

  // lstをvにコピーする
  copy(lst.begin(), lst.end(), v.begin());

  // 結果の表示する
  cout << "Contents of vector after copy:\n";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";

  return 0;
}


// 単項関数オブジェクトを使用する
#include < iostream>
#include < list>
#include < functional>
#include < algorithm>
using namespace std;

int main()
{
  list< double> vals;
  int i;

  // リストに値を入れる
  for(i=1; i<10; i++) vals.push_back((double)i);

  cout << "Original contents of vals:\n";
  list< double>::iterator p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
 
  // negate関数オブジェクトを使用する
  p = transform(vals.begin(), vals.end(),
                vals.begin(),
                negate< double>()); // 関数オブジェクトを使用する

  cout << "Negated contents of vals:\n";
  p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }

  return 0;
}

// 二項関数オブジェクトを使用する
#include < iostream>
#include < list>
#include < functional>
#include < algorithm>
using namespace std;

int main()
{
  list< double> vals;
  list< double> divisors;
  int i;

  // リストに値を入れる
  for(i=10; i<100; i+=10) vals.push_back((double)i);
  for(i=1; i<10; i++) divisors.push_back(3.0);

  cout << "Original contents of vals:\n";
  list< double>::iterator p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }

  cout << endl;
 
  // valsを変換する
  p = transform(vals.begin(), vals.end(),
                divisors.begin(), vals.begin(),
                divides< double>()); // 関数オブジェクトを使用する

  cout << "Divided contents of vals:\n";
  p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }

  return 0;
}
1