stl sample

// 両端キューの使用例
#include < iostream>
#include < deque>
#include < cstring>
using namespace std;

int main()
{
  deque< char> q1;
  char str[] = "Using a deque.";
  int i;

  for(i=0; str[i]; i++) {
    q1.push_front(str[i]);
    q1.push_back(str[i]);
  }

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

  // 逆順の文字列を削除する
  for(i=0; i< strlen(str); i++) q1.pop_front();
  cout << "q1 after popping front:\n";
  for(i=0; i< q1.size(); i++)
    cout << q1[i];
  cout << "\n\n";

  deque< char> q2(q1); // q1のコピーを構築する
  cout << "q2 original contents:\n";
  for(i=0; i< q2.size(); i++)
    cout << q2[i];
  cout << "\n\n";

  // q2をずらす
  for(i=0; i< q2.size(); i++)
     q2[i] = q2[i]+1;
  
  cout << "q2 transposed contents:\n";
  for(i=0; i< q2.size(); i++)
    cout << q2[i];
  cout << "\n\n";

  // 最初のaを指す反復子を取得する
  deque< char>::iterator p = q1.begin();
  while(p != q1.end()) {
    if(*p == 'a') break;
    p++;
  }

  // ずらしたq2をq1へ挿入する
  q1.insert(p, q2.begin(), q2.end());

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

  return 0;
}

// dequeを反転しながらコピーする1つの方法
#include < iostream>
#include < deque>
using namespace std;

int main()
{
  deque< char> q;
  deque< char> rev_q;
  int i;

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

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

  // qから要素を削除し、rev_qに逆順に格納する
  while(!q.empty()) {
    rev_q.push_front(q.front());
    q.pop_front();
  }

  cout << "Contents of rev_q: ";
  for(i=0; i< rev_q.size(); i++) 
    cout << rev_q[i];
    
  return 0;
}

// 両端キューを回転する
#include < iostream>
#include < deque>
#include < string>
using namespace std;

// 両端キューを左に回転する
template < class T> lrot(deque< T> &q)
{
  q.push_back(q.front());
  q.pop_front();
}

// 両端キューを右に回転する
template < class T> rrot(deque< T> &q)
{
  q.push_front(q.back());
  q.pop_back();
}

int main()
{
  deque< string> w;
  int i, n;

  w.push_back("Rotation");
  w.push_back("is");
  w.push_back("easy");
  w.push_back("using");
  w.push_back("deque.");

  cout << "This is the original sentence:\n";
  for(i=0; i< w.size(); i++)
    cout << w[i] << " ";
  cout << "\n\n";

  cout << "First, left rotate:\n";
  for(n=0; n< w.size(); n++) {
    lrot(w);
    for(i=0; i< w.size(); i++)
      cout << w[i] << " ";
    cout << "\n";
  }

  cout << "\nNow, right rotate:\n";
  for(n=0; n< w.size(); n++) {
    rrot(w);
    for(i=0; i< w.size(); i++)
      cout << w[i] << " ";
    cout << "\n";
  }

  return 0;
}


// 逆方向反復子を使用する
#include < iostream>
#include < deque>
using namespace std;

int main()
{
  deque< int> q;
  deque< int>::reverse_iterator rp;
  int i;

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

  cout << "Contents printed backward:\n";
  rp = q.rbegin();
  while(rp != q.rend()) {
    cout << *rp << " ";
    rp++;
  }
  cout << "\n\n";

  cout << "Contents printed forward:\n";
  rp = q.rend();
  while(rp != q.rbegin()) {
    rp--;
    cout << *rp << " ";
  }

  return 0;
}

// 逆方向反復子とコピー
#include < iostream>
#include < deque>
#include < algorithm>
#include < cstring>
using namespace std;

int main()
{
  deque< char> q1(30), q2, q3;
  int i;

  char str1[] = "forward";
  for(i=0; str1[i]; i++) q2.push_back(str1[i]);

  // 順方向へコピーする
  copy(q2.begin(), q2.end(), q1.begin());

  cout << "Contents q1 after forward copy:\n";
  for(i=0; i< q1.size(); i++)
    cout << q1[i];
  cout << "\n\n";

  char str2[] = "backward";
  for(i=0; str2[i]; i++) q3.push_back(str2[i]);

  // 逆方向へコピーする
  copy(q3.rbegin(), q3.rend(), q1.begin()+strlen(str1));

  cout << "Contents q1 after reverse copy:\n";
  for(i=0; i< q1.size(); i++)
    cout << q1[i];

  return 0;
}

// 両端キューオブジェクトへの代入
#include < iostream>
#include < deque>
using namespace std;

int main()
{
  deque< char> q1(10), q2;
  int i;

  for(i=0; i<10; i++) q1[i] = i + 'A';
  cout << "Contents of q1 are: ";
  for(i=0; i< q1.size(); i++)
    cout << q1[i];
  cout << "\n\n";

  // 両端キューを別の両端キューに代入する
  q2 = q1;

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

  // q1の特定の範囲をq2に代入する
  q2.assign(q1.begin()+2, q1.end()-2);

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

  // いくつかの要素をq2に代入する
  q2.assign(8, 'X');

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

  return 0;
}

// swap()の使用例
#include < iostream>
#include < deque>
using namespace std;

int main()
{
  deque< char> q1, q2;
  int i;

  for(i=0; i<26; i++) q1.push_back(i+'A');
  for(i=0; i<10; i++) q2.push_front(i+'0');

  cout << "Size of q1 and q2: ";
  cout << q1.size() << " " << q2.size() << "\n";

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

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

  // メンバ関数を使って両端キューを交換する
  q1.swap(q2);

  cout << "Size of q1 and q2 after first swap: ";
  cout << q1.size() << " " << q2.size() << "\n";

  cout << "q1 after first swap: ";
  for(i=0; i< q1.size(); i++)
    cout << q1[i];
  cout << "\n";

  cout << "q2 after first swap: ";
  for(i=0; i< q2.size(); i++)
    cout << q2[i];
  cout << "\n\n";

  // アルゴリズムを使って両端キューを交換する
  swap(q1, q2);

  cout << "Size of q1 and q2 after second swap: ";
  cout << q1.size() << " " << q2.size() << "\n";

  cout << "q1 after second swap: ";
  for(i=0; i< q1.size(); i++)
    cout << q1[i];
  cout << "\n";

  cout << "q2 after second swap: ";
  for(i=0; i< q2.size(); i++)
    cout << q2[i];
  cout << "\n";

  return 0;
}


// resize()の使用例
#include < iostream>
#include < deque>
#include < algorithm>
#include < cmath>
using namespace std;

int main()
{
  deque< double> radians, sines;
  double num;
  int i;

  for(;;) {
    cout << "Enter angles (0 to stop): ";
    cin >> num;
    if(num == 0.0) break;
    radians.push_back(num);
  }

  // すべての結果を格納できるようにsinesのサイズを変更する
  sines.resize(radians.size());

  transform(radians.begin(), radians.end(),
            sines.begin(), sin);

  for(i=0; i< sines.size(); i++) {
    cout << "Angle and sine: ";
    cout << radians[i] << " " << sines[i];
    cout << "\n";
  }
  cout << "\n";
   
  return 0;
}


// 反復子の値が変化することに注意
#include < iostream>
#include < deque>
using namespace std;

int main()
{
  deque< char> q;
  deque< char>::iterator p1, p2;
  int i;

  for(i=0; i<5; i++) q.push_back(i + 'A');

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

  p1 = q.begin() + 2;
  p2 = q.begin() + 3;
  cout << "*p1: " << *p1 << ", ";
  cout << "*p2: " << *p2 << "\n";
  cout << "\n";

  // シーケンスに要素を挿入する
  q.insert(p1, 'X');

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

  // これらは異なる要素を指している
  cout << "*p1: " << *p1 << ", ";
  cout << "*p2: " << *p2 << "\n";

  return 0;
}

// 両端キューを使用して順不同の情報パケットを再構成する
#include < iostream>
#include < deque>
#include < algorithm>
#include < string>
using namespace std;

class packet {
  int pnum;    // パケット番号
  string info; // 情報
public:
  packet() { pnum = -1; info = ""; }
  packet(int n, string i) {
    pnum = n;
    info = i;
  }

  int getpnum() const { return pnum; } 
  string getinfo() { return info; }
};

// 2つのパケットの大小を比較する
bool operator< (const packet &a, const packet &b) {
  return a.getpnum() < b.getpnum();
}

// 2つのパケットが等しいかどうかを判定する
bool operator==(const packet &a, const packet &b) {
  return a.getpnum() == b.getpnum();
}

/* 次のパケットを取得する
   パケットが取得できた場合はtrueを返し、
   そうでない場合はfalseを返す */
bool getpacket(packet &pkt)
{
  static packet message[] = {
    packet(2, "is"),
    packet(4, "Programming"),
    packet(0,"The"),
    packet(3, "Power"),
    packet(1, "STL"),
    packet(-1, "") // 転送の終了を示すマーク
  };
  static int i=0;

  if(message[i] == packet(-1, "")) return false;

  pkt = message[i];

  cout << "Sending: " << pkt.getinfo() << "\n";

  i++;
  return true;
}

int main()
{
  deque< packet> pack;
  deque< packet>::iterator p;
  packet pkt;

  getpacket(pkt); // 最初のパケットを取得する
  pack.push_back(pkt); // 最初のパケットを両端キューに格納する

  // 残りのパケットを読み取り、格納する
  while(getpacket(pkt)) {
    if(pkt.getpnum() <= pack.front().getpnum())
      pack.push_front(pkt);
    else if(pkt.getpnum() >= pack.back().getpnum())
      pack.push_back(pkt);
    else {
      p = lower_bound(pack.begin(), pack.end(), pkt);
      pack.insert(p, pkt);
    }
  }

  cout << "\nPackets reassembled:\n";
  for(int i=0; i< pack.size(); i++)
    cout << pack[i].getinfo() << " "; 

  return 0;
}
1