stl sample

// ベクタの4とおりの構築方法
#include < iostream>
#include < vector>
using namespace std;

int main()
{
  vector< char> a; // 空のベクタを作成する
  vector< char> b(5, 'X'); // サイズを指定して初期化する
  vector< char> c(b); // ほかのベクタで初期化する 
  int i;

  // AからEの値をaに与える
  for(i=0; i<5; i++) a.push_back('A'+i);

  // 範囲からベクタを作成する
  vector< char> d(a.begin()+1, a.end()-1); 

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

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

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

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

  return 0;
}


// 容量とサイズ
#include < iostream>
#include < vector>
using namespace std;

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

  cout << "Initial size: " << v.size() << "\n";
  cout << "Initial capacity: " << v.capacity();
  cout << "\n\n";

  v.reserve(20); // より大きな領域を確保する
  cout << "Size after reserve: " << v.size() << "\n";
  cout << "Capacity after reserve: " << v.capacity();
  cout << "\n\n";

  return 0;
}


// reserve()を使って再割り当てを回避する
#include < iostream>
#include < vector>
#include < cstdlib>
using namespace std;

const int getsize = 0;
const int getbytes = 1;
const int reset = 2;

int producer(int what);
void consumer(vector< int> &v);

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

  do {
    consumer(v);

    cout << "Current contents of v:\n";
    for(int i=0; i< v.size(); i++) {
      cout << v[i] << " ";
      if(!((i+1)%16)) cout << "\n";
    }

    cout << "\nMore? (Y/N): ";
    cin >> more;
  } while(more == 'y');

  return 0;
}

// データを生成する
int producer(int what)
{
  static int howmany = rand() % 20 + 1;

  switch(what) {
    case getsize: return howmany;
      break;
    case getbytes: return howmany--;
      break;
    case reset:
      howmany = rand() % 20 + 1;
      return howmany;
  }

  return 0; // エラー
}
    
// データを読み出してvの末尾に追加する
void consumer(vector< int> &v)
{
  int packet_size = producer(getsize);

  cout << "Producer sending " << packet_size << " units.\n";

  v.reserve(packet_size + v.size());
  do {
    v.push_back(producer(getbytes));
    packet_size--;
  } while(packet_size);

  producer(reset);
}


// ベクタは必要なメモリよりも多くのメモリを割り当てる場合がある
#include < iostream>
#include < vector>
using namespace std;

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

  cout << "Initial size: " << v.size() << "\n";
  cout << "Initial capacity: " << v.capacity();
  cout << "\n\n";
 
  v.push_back('X'); // 要素をもう1つvに追加する

  cout << "Size after push_back: " << v.size() << "\n";
  cout << "New capacity: " << v.capacity();
  cout << "\n\n";

  v.resize(100); // サイズを100に変更する

  cout << "Size after resize: " << v.size() << "\n";
  cout << "Capacity after resize: " << v.capacity();
  cout << "\n\n";

  v.push_back('Y'); // 要素をもう1つvに追加する

  cout << "Size after push_back: " << v.size() << "\n";
  cout << "New capacity: " << v.capacity();
  cout << "\n\n";

  return 0;
}

// []とat()
#include < iostream>
#include < vector>
using namespace std;

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

  try {
    for(i=0; i<100; i++) v.at(i) = 100;
  } catch(out_of_range excpt) {
    cout << "Out-of-bounds access attempted ";
    cout << "at location " << i << "\n";
  }

  // プログラムがクラッシュする
  // for(i=0; i<100; i++)  v[i] = 100; 

  return 0;
}

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

int main()
{
  vector v;
  int i;

  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";

  cout << "Initial size of v: ";
  cout << v.size() << "\n";

  cout << "Initial capacity of v: ";
  cout << v.capacity() << "\n\n";

  v.clear();

  cout << "Size of v after clear(): ";
  cout << v.size() << "\n";

  cout << "Capacity of v after clear(): ";
  cout << v.capacity() << "\n\n";

  // 新しい値をvに追加する
  for(i=0; i<10; i++) v.push_back(i*10);

  cout << "New contents of v: ";
  for(i=0; i< v.size(); i++)
    cout << v[i] << " ";
  cout << "\n";
  
  cout << "Size of v after adding new elements: ";
  cout << v.size() << "\n";

  cout << "Capacity of v after adding new elements: ";
  cout << v.capacity() << "\n\n";

  return 0;
}

// データの集合の平均と標準偏差を計算する
#include < iostream>
#include < vector>
#include < cmath>
using namespace std;

int main()
{
  vector< double> v;
  int i;
  double sum, avg, std_dev;

  cout << "Enter numbers (0 to stop).\n";
  do {
    cout << ": ";
    cin >> i;
    if(i) v.push_back(i);
  } while(i);
  cout << "\n";

  // 平均を求める
  sum = 0.0;  // この1行は監修者による追加
  for(i=0; i< v.size(); i++) 
    sum += v[i];
  avg = sum / v.size();
  cout << "Average is: " << avg << "\n\n";


  // 標準偏差を求める
  sum = 0.0;
  for(i=0; i< v.size(); i++) 
    sum += (v[i]-avg) * (v[i]-avg);
  std_dev = sqrt(sum/ v.size());
  cout << "Standard deviation is: " << std_dev;
  cout << "\n";

  return 0;
}


// クラスのオブジェクトをベクタに格納する
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstdlib>
using namespace std;

class DailyOutput {
  int units;
public:
  DailyOutput() { units = 0; }
  DailyOutput(int x) { units = x; }

  double get_units() { return units; }
};

bool operator<(DailyOutput a, DailyOutput b)
{
  return a.get_units() < b.get_units();
}

bool operator==(DailyOutput a, DailyOutput b)
{
  return a.get_units() == b.get_units();
}

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

  for(i=0; i<14; i++)
    v.push_back(DailyOutput(60 + rand()%10));

  cout << "Daily production:\n";
  for(i=0; i< v.size(); i++)
    cout << v[i].get_units() << " ";
  cout << "\n\n";

  p = min_element(v.begin(), v.end());
  cout << "Minimum units: " << p->get_units();
  cout << "\n";

  p = max_element(v.begin(), v.end());
  cout << "Maximum units: " << p->get_units();
  cout << "\n\n";  
  
  // 同じ生産量が連続する日を探す
  p = v.begin();
  do {
    p = adjacent_find(p, v.end());
    if(p != v.end()) {
      cout << "Two consecutive days with ";
      cout << p->get_units() << " units.\n";
      p++; // move on to next element
    }
  } while(p != v.end());

  return 0;
}
1