stl sample

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

int main()
{
  vector< int> v;
  vector< int>::iterator itr;
  int i;

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

  cout << "Original contents of v: ";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";
  cout << endl;

  itr = v.begin();
  itr += 2; // 2番目の要素を指す

  // insert_iteratorを要素2に作成する
  insert_iterator< vector< int> > i_itr(v, itr);

  // 上書きではなく、挿入が行われる
  *i_itr++ = 100;
  *i_itr = 200;

  cout << "v after insertion: ";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";

  return 0;
}

// 挿入反復子を使ってベクタをほかのベクタに挿入する
#include < iostream>
#include < iterator>
#include < vector>
#include < string>
using namespace std;

int main()
{
  vector< string> v, v2;
  vector< string>::iterator itr;

  v.push_back("The");
  v.push_back("STL");
  v.push_back("are");
  v.push_back("powerful.");

  v2.push_back("and");
  v2.push_back("insert");
  v2.push_back("iterators");

  cout << "Original size of v: " << v.size() << endl;
  cout << "Original contents of v:\n";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";
  cout << "\n\n";

  // v2を挿入する
  copy(v2.begin(), v2.end(), inserter(v, v.begin()+2));

  cout << "Size of v after insertion: ";
  cout << v.size() << endl;
  cout << "Contents of v after insertion:\n";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";

  return 0;
}

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

int main()
{
  vector< int> v, v2;
  vector< int>::iterator itr;
  int i;

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

  cout << "Original contents of v: ";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";
  cout << endl;

  // vに対してback_insert_iteratorを作成する
  back_insert_iterator< vector< int> > bck_i_itr(v);

  // 上書きではなく、挿入が行われる
  *bck_i_itr++ = 100;
  *bck_i_itr = 200;

  cout << "v after insertion: ";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";
  cout << endl;

  cout << "Size of v2 before copy: " << v2.size()
       << endl;

  // back_inserter()を使ってvをv2にコピーする
  copy(v.begin(), v.end(), back_inserter(v2));

  cout << "Size of v2 after copy: " << v2.size()
       << endl;

  cout << "Contents of v2 after insertion: ";
  itr = v2.begin();
  while(itr != v2.end())
    cout << *itr++ << " ";

  return 0;
}

// front_insert_iteratorの使用例
#include < iostream>
#include < iterator>
#include < list>
using namespace std;

int main()
{
  list< int> v, v2;
  list< int>::iterator itr;
  int i;

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

  cout << "Original contents of v: ";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";
  cout << endl;

  // vに対してfront_insert_iteratorを作成する
  front_insert_iterator< list< int> > frnt_i_itr(v);

  // 上書きではなく、挿入が行われる
  *frnt_i_itr++ = 100;
  *frnt_i_itr = 200;

  cout << "v after insertion: ";
  itr = v.begin();
  while(itr != v.end())
    cout << *itr++ << " ";
  cout << endl;

  cout << "Size of v2 before copy: " << v2.size()
       << endl;

  // front_inserter()を使ってvをv2にコピーする
  copy(v.begin(), v.end(), front_inserter(v2));

  cout << "Size of v2 after copy: " << v2.size()
       << endl;

  cout << "Contents of v2 after insertion: ";
  itr = v2.begin();
  while(itr != v2.end())
    cout << *itr++ << " ";

  return 0;
}

// istream_iteratorを使ってさまざまなデータ型を読み取る
#include < iostream>
#include < iterator>
#include < string>
#include < vector>
using namespace std;

int main()
{
  int i;
  double d;
  string str;
  vector< int> vi;
  vector< double> vd;
  vector< string> vs;
 
  cout << "Enter some integers, enter 0 to stop.\n";
  istream_iterator< int> int_itr(cin);
  do {
    i = *int_itr; // 次のintを読み取る
    if(i != 0) {
      vi.push_back(i); // それを保存する
      ++int_itr; // 次のintを入力する
    }
  } while (i != 0); 

  cout << "Enter some doubles, enter 0 to stop.\n";
  istream_iterator< double> double_itr(cin);
  do {
    d = *double_itr; // 次のdoubleを読み取る
    if(d != 0.0) {
      vd.push_back(d); // それを保存する
      ++double_itr; // 次のdoubleを入力する
    }
  } while (d != 0.0); 

  cout << "Enter some strings, enter 'quit' to stop.\n";
  istream_iterator< string> string_itr(cin);
  do {
    str = *string_itr; // 次の文字列を読み取る
    if(str != "quit") {
      vs.push_back(str); // それを保存する
      ++string_itr;
    }
  } while (str != "quit"); // 次の文字列を入力する

  cout << "Here is what you entered:\n";
  for(i=0; i< vi.size(); i++)
    cout << vi[i] << " ";
  cout << endl;

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

  for(i=0; i< vs.size(); i++)
    cout << vs[i] << " ";

  return 0;
}

// istream_iteratorをcopyアルゴリズムで使用する
#include < iostream>
#include < iterator>
#include < algorithm>
#include < vector>
using namespace std;

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

  cout << "Enter 5 integers: \n";
  
  istream_iterator< int> int_itr(cin);
  copy(int_itr, istream_iterator(), v.begin());

  cout << "Here are the values you entered: ";
  for(i=0; i< v.size(); i++) cout << v[i] << " ";

  return 0;
}

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

int main()
{
  ostream_iterator< char> out_it(cout);

  *out_it = 'X';
  out_it++;
  *out_it = 'Y';
  out_it++;
  *out_it = ' ';

  char str[] = "C++ Iterators are powerful.\n";
  char *p = str;
  
  while(*p) *out_it++ = *p++;

  ostream_iterator< double> out_double_it(cout);
  *out_double_it = 187.23;  
  out_double_it++;
  *out_double_it = -102.7;  

  return 0;
}

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

int main()
{
  list< string> lst;
  ostream_iterator< string> out_it(cout);

  lst.push_back("Stream ");
  lst.push_back("iterators ");
  lst.push_back("are ");
  lst.push_back("useful.");

  copy(lst.begin(), lst.end(), out_it);

  return 0;
}

/* istreambuf_iterator、ostreambuf_iterator、およびreplace_copy()を使って
   ファイルをフィルタ処理する */
#include < iostream>
#include < fstream>
#include < iterator>
#include < algorithm>
using namespace std;

int main(int argc, char *argv[])
{
  if(argc!=3) {
    cout << "Usage: replace in out\n";
    return 1;
  }

  ifstream in(argv[1]);
  ofstream out(argv[2]);

  // ファイルが開いたことを確認する
  if(!in) {
    cout << "Cannot open input file.\n";
    return 1;
  }
  if(!out) {
    cout << "Cannot open output file.\n";
    return 1;
  }

  // ストリーム反復子を作成する
  istreambuf_iterator< char> in_itr(in);
  ostreambuf_iterator< char> out_itr(out);

  // 文字を置き換えながらファイルをコピーする
  replace_copy(in_itr, istreambuf_iterator< char>(), 
               out_itr, ' ', '|');

  in.close();
  out.close();

  return 0;
}


// advance()とdistance()の使用例
#include < iostream>
#include < list>
#include < iterator>
using namespace std;

int main()
{
  list< char> lst;
  list< char>::iterator p;
  int i;

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

  p = lst.begin(); 
  cout << "Character at p: " << *p << endl;

  // advance()を使って2文字分だけ前方へ移動する

//  p += 2; // listに対しては不可
  advance(p, 2); // これなら許される
  cout << "Character at p+2: " << *p << endl;

  // distance()の使用例
  cout << "Number of elements from lst.begin() ";
  cout << "to lst.end(): ";

//  cout << lst.end()-lst.begin(); // 不可
  cout << distance(lst.begin(), lst.end());

  return 0;
}

1