// 両端キューの使用例
#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;
}