// copy()を使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v(10);
vector< char> v2(10);
int i;
for(i=0; i<10; i++) v[i] = 'A'+i;
for(i=0; i<10; i++) v2[i] = 'z';
// vのすべての要素をv2にコピーする
copy(v.begin(), v.end(), v2.begin());
cout << "Contents of v2 after complete copy:\n";
for(i=0; i<10; i++)
cout << v2[i] << " ";
cout << "\n\n";
// v2を再び初期化する
for(i=0; i<10; i++) v2[i] = 'z';
// vの一部をv2にコピーする
copy(v.begin()+2, v.end()-2, v2.begin());
cout << "Contents of v2 after subsequence copy:\n";
for(i=0; i<10; i++)
cout << v2[i] << " ";
cout << "\n\n";
// v2を再び初期化する
for(i=0; i<10; i++) v2[i] = 'z';
// vの一部をv2の中間にコピーする
copy(v.begin()+2, v.end()-2, v2.begin()+3);
cout << "Contents of v2 after copy into middle:\n";
for(i=0; i<10; i++)
cout << v2[i] << " ";
cout << "\n\n";
return 0;
}
// swap_ranges()を使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v(10);
vector< char> v2(10);
int i;
for(i=0; i<10; i++) v[i] = 'A'+i;
for(i=0; i<10; i++) v2[i] = '0' + i;
cout << "Original contents of v:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n";
cout << "Original contents of v2:\n";
for(i=0; i<10; i++)
cout << v2[i] << " ";
cout << "\n\n";
// vとv2の範囲を交換する
swap_ranges(v.begin()+2, v.end()-3, v2.begin()+4);
cout << "Contents of v after swap:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n";
cout << "Contents of v2 after swap:\n";
for(i=0; i<10; i++)
cout << v2[i] << " ";
cout << "\n";
return 0;
}
// find()とfind_if()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstring>
using namespace std;
// chがカンマならtrueを返す
bool iscomma(char ch)
{
if(ch==',') return true;
return false;
}
int main()
{
vector< char> v;
vector< char>::iterator p;
char str[] = "One, Two, Three";
int i;
for(i=0; i< strlen(str); i++)
v.push_back(str[i]);
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout << v[i];
cout << endl;
// find the first T
p = find(v.begin(), v.end(), 'T');
cout << "Sequence beginning with T: ";
while(p != v.end())
cout << *p++;
cout << endl;
// 最初のカンマを探す
p = find_if(v.begin(), v.end(), iscomma);
cout << "After find first comma: ";
while(p != v.end())
cout << *p++;
cout << endl;
return 0;
}
// search()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstring>
using namespace std;
int main()
{
vector< char> v, v2;
vector< char>::iterator p;
char str1[] = "One, Two, Three, Two again";
char str2[] = "Two";
int i;
for(i=0; i< strlen(str1); i++)
v.push_back(str1[i]);
for(i=0; i< strlen(str2); i++)
v2.push_back(str2[i]);
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout << v[i];
cout << endl;
// 最初の"Two"を探す
p = search(v.begin(), v.end(), v2.begin(), v2.end());
cout << "Sequence beginning with Two: ";
while(p != v.end())
cout << *p++;
cout << endl;
return 0;
}
// mismatch()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
#include < cstring>
#include < utility>
using namespace std;
int main()
{
vector< char> v, v2;
pair< vector< char>::iterator, vector< char>::iterator> p;
char str1[] = "One, Two, Three, Two again";
char str2[] = "One, Two, Four, Five, Nine";
int i;
for(i=0; i< strlen(str1); i++)
v.push_back(str1[i]);
for(i=0; i< strlen(str2); i++)
v2.push_back(str2[i]);
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout << v[i];
cout << endl;
cout << "Contents of v2: ";
for(i=0; i< v2.size(); i++)
cout << v2[i];
cout << endl;
// 最初の相違を探す
p = mismatch(v.begin(), v.end(), v2.begin());
if(p.first != v.end()) { // mismatch found
cout << "The character " << *p.first;
cout << " in v mismatches the character ";
cout << *p.second << " in v2.\n";
}
return 0;
}
// sort()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
void init_v(vector< int> &v)
{
v[0] = 99;
v[1] = 5;
v[2] = 109;
v[3] = -3;
v[4] = 44;
v[5] = 10;
v[6] = 108;
v[7] = 7;
v[8] = 11;
v[9] = 76;
}
int main()
{
vector< int> v(10);
int i;
// コンテナのすべての要素をソートする
init_v(v); // vを初期化する
cout << "Sort an entire container.\n";
cout << "Original order:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n";
sort(v.begin(), v.end());
cout << "Order after sorting container:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n\n";
// コンテナの一部をソートする
init_v(v); // vを再初期化する
cout << "Sort a subset of a container.\n";
cout << "Original order:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n";
sort(v.begin()+2, v.end()-2);
cout << "Order after sorting v[2] through v[7]:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n\n";
return 0;
}
// partial_sort()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
void init_v(vector< int> &v)
{
v[0] = 99;
v[1] = 5;
v[2] = 109;
v[3] = -3;
v[4] = 44;
v[5] = 10;
v[6] = 108;
v[7] = 7;
v[8] = 11;
v[9] = 76;
}
int main()
{
vector< int> v(10);
int i;
init_v(v); // vを初期化する
cout << "Original order:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n";
partial_sort(v.begin(), v.begin()+5, v.end());
cout << "Order after partial sorting:\n";
for(i=0; i<10; i++)
cout << v[i] << " ";
cout << "\n";
return 0;
}
// binary_search()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
bool result;
int i;
for(i=0; i<10; i++)
v.push_back('A' + i);
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout << v[i];
cout << endl;
// Fを検索する
cout << "Looking for F.\n";
result = binary_search(v.begin(), v.end(), 'F');
if(result)
cout << "F Found\n";
else
cout << "F Not Found\n";
// Xを検索する
cout << "Looking for X.\n";
result = binary_search(v.begin(), v.end(), 'X');
if(result)
cout << "X Found\n";
else
cout << "X Not Found\n";
return 0;
}
// lower_bound()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
vector< char>::iterator p;
int i;
for(i=0; i<10; i++)
v.push_back('A' + i);
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout << v[i];
cout << endl;
// Fを検索する
cout << "Looking for F.\n";
p = lower_bound(v.begin(), v.end(), 'F');
if(p != v.end())
cout << *p << " Found\n";
else
cout << "F Not Found\n";
// Xを検索する
cout << "Looking for X.\n";
p = lower_bound(v.begin(), v.end(), 'X');
if(p != v.end())
cout << *p << " Found\n";
else
cout << "X Not Found\n";
return 0;
}
// remove()とreplace()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
vector< char>::iterator p, p_end;
int i;
for(i=0; i<5; i++) {
v.push_back('A'+i);
v.push_back('A'+i);
v.push_back('A'+i);
}
cout << "Original contents of v:\n";
for(p=v.begin(); p< v.end(); p++)
cout << *p << " ";
cout << endl;
// すべての"C"を削除する
p_end = remove(v.begin(), v.end(), 'C');
cout << "Sequence after removing all C's:\n";
for(p=v.begin(); p< p_end; p++)
cout << *p << " ";
cout << endl;
// "D"を"X"に置換する
replace(v.begin(), v.end(), 'D', 'X');
cout << "Sequence after replacement:\n";
for(p=v.begin(); p< p_end; p++)
cout << *p << " ";
cout << endl;
return 0;
}
// unique()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
vector< char>::iterator p, p_end;
int i;
for(i=0; i<5; i++) {
v.push_back('A'+i);
v.push_back('A'+i);
v.push_back('A'+i);
}
cout << "Original contents of v:\n";
for(p=v.begin(); p< v.end(); p++)
cout << *p << " ";
cout << endl;
// 重複要素を削除する
p_end = unique(v.begin(), v.end());
cout << "Sequence after removing duplicates:\n";
for(p=v.begin(); p< p_end; p++)
cout << *p << " ";
cout << endl;
return 0;
}
// シーケンスの変換
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
double midpoint(double a, double b)
{
return ((a-b) / 2) + b;
}
int main()
{
vector< double> v1(5), v2(5), v3(5);
int i;
v1[0] = 10.0;
v1[1] = 98.6;
v1[2] = 12.23;
v1[3] = 88.8;
v1[4] = -212.01;
v2[0] = 2.0;
v2[1] = 3.3;
v2[2] = 4.19;
v2[3] = 155.0;
v2[4] = -2.0;
cout << "Values in v1: ";
for(i=0; i< v1.size(); i++)
cout << v1[i] << " ";
cout << endl;
cout << "Values in v2: ";
for(i=0; i< v2.size(); i++)
cout << v2[i] << " ";
cout << endl;
// v1の要素とv2の要素の中点を見つける
transform(v1.begin(), v1.end(), v2.begin(),
v3.begin(), midpoint);
// 中点
cout << "Midpoints: ";
for(i=0; i< v3.size(); i++)
cout << v3[i] << " ";
return 0;
}
// シーケンスの生成
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
// 簡単な生成関数
double f()
{
static double val = 1.0;
double t;
t = 1.0 / val;
val += val;
return t;
}
int main()
{
vector< double> v(5);
int i;
// 数列を生成する
generate(v.begin(), v.end(), f);
cout << "Series: ";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
return 0;
}
// シーケンスを回転する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< int> v;
vector< int>::iterator p;
int i;
for(i=0; i<10; i++) v.push_back(i);
cout << "Original ordering: ";
for(p=v.begin(); p< v.end(); p++)
cout << *p << " ";
cout << endl;
// 左方向に1つ回転する
rotate(v.begin(), v.begin()+1, v.end());
cout << "Order after left rotate: ";
for(p=v.begin(); p< v.end(); p++)
cout << *p << " ";
cout << endl;
return 0;
}
// シーケンスを右方向に回転する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< int> v;
vector< int>::iterator p;
int i;
for(i=0; i<10; i++) v.push_back(i);
cout << "Original ordering: ";
for(p=v.begin(); p< v.end(); p++)
cout << *p << " ";
cout << endl;
// 逆方向反復子を使って右方向に2つ回転する
rotate(v.rbegin(), v.rbegin()+2, v.rend());
cout << "Order after two right rotates: ";
for(p=v.begin(); p< v.end(); p++)
cout << *p << " ";
cout << endl;
return 0;
}
// random_shuffle()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
int i;
for(i=0; i<26; i++) v.push_back('A'+i);
cout << "Original contents of v:\n";
for(i=0; i< v.size(); i++)
cout << v[i];
cout << "\n\n";
random_shuffle(v.begin(), v.end());
cout << "Shuffled contents of v:\n";
for(i=0; i< v.size(); i++)
cout << v[i];
return 0;
}
// 2つのシーケンスをマージする
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v1, v2, v3(26);
int i;
for(i=0; i<26; i+=2) v1.push_back('A'+i);
for(i=0; i<26; i+=2) v2.push_back('B'+i);
cout << "Original contents of v1:\n";
for(i=0; i< v1.size(); i++)
cout << v1[i];
cout << "\n\n";
cout << "Original contents of v2:\n";
for(i=0; i< v2.size(); i++)
cout << v2[i];
cout << "\n\n";
// シーケンスをマージする
merge(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v3.begin());
cout << "Result of merge:\n";
for(i=0; i< v3.size(); i++)
cout << v3[i];
return 0;
}
// 同一シーケンス内でマージを行う
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v1;
int i;
for(i=0; i<26; i+=2) v1.push_back('A'+i);
for(i=0; i<26; i+=2) v1.push_back('B'+i);
cout << "Original contents of v1:\n";
for(i=0; i< v1.size(); i++)
cout << v1[i];
cout << "\n\n";
// v1内の2つの範囲をマージする
inplace_merge(v1.begin(), v1.begin()+13, v1.end());
cout << "Result of merge:\n";
for(i=0; i< v1.size(); i++)
cout << v1[i];
return 0;
}
// 集合アルゴリズムの使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v1, v2, v_res(26), v3;
vector< char>::iterator p, pres_end;
int i;
for(i=0; i<20; i++) v1.push_back('A'+i);
for(i=10; i<26; i++) v2.push_back('A'+i);
cout << "Contents of v1:\n";
for(i=0; i< v1.size(); i++)
cout << v1[i];
cout << "\n";
cout << "Contents of v2:\n";
for(i=0; i< v2.size(); i++)
cout << v2[i];
cout << "\n\n";
// 和
pres_end = set_union(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v_res.begin());
cout << "Set union: ";
for(p=v_res.begin(); p!=pres_end; p++)
cout << *p;
cout << "\n\n";
// 差
pres_end = set_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v_res.begin());
cout << "Set difference: ";
for(p=v_res.begin(); p!=pres_end; p++)
cout << *p;
cout << "\n\n";
// 対称差
pres_end = set_symmetric_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v_res.begin());
cout << "Set symmetric difference: ";
for(p=v_res.begin(); p!=pres_end; p++)
cout << *p;
cout << "\n\n";
// 交差
pres_end = set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v_res.begin());
cout << "Set intersection: ";
for(p=v_res.begin(); p!=pres_end; p++)
cout << *p;
cout << "\n\n";
// 包含
v3.push_back('A');
v3.push_back('C');
v3.push_back('D');
// 以下の4行は監修者による追加
cout << "Contents of v3: \n";
for(i=0; i< v3.size(); i++)
cout << v3[i];
cout << "\n\n";
if(includes(v1.begin(), v1.end(),
v3.begin(), v3.end()))
cout << "v1 includes all of v3\n";
else
cout << "v3 contains elements not found in v1\n";
return 0;
}
// 順列を作成する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
int i;
for(i=0; i<3; i++) v.push_back('A'+i);
cout << "All permutations of 3 characters:\n";
do {
for(i=0; i< v.size(); i++)
cout << v[i];
cout << "\n";
} while(next_permutation(v.begin(), v.end()));
return 0;
}
// 順列を作成する
#include
#include
#include
using namespace std;
int main()
{
vector v;
int i;
for(i=0; i<3; i++) v.push_back('A'+i);
cout << "3文字の順列をすべて挙げると:\n";
do {
for(i=0; i< v.size(); i++)
cout >< v[i];
cout << "\n";
} while(next_permutation(v.begin(), v.end()));
return 0;
}
// ヒープを使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v;
int i;
for(i=0; i<20; i+=2) v.push_back('A'+i);
cout << "Sequence before building heap:\n";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
// ヒープを構築する
make_heap(v.begin(), v.end());
cout << "Sequence after building heap:\n";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
// ヒープに"H"をプッシュする
v.push_back('H'); // まず、ベクタにHを挿入する
push_heap(v.begin(), v.end()); // 次に、Hをヒープにプッシュする
cout << "Sequence after pushing onto heap:\n";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
// ヒープから値をポップする
pop_heap(v.begin(), v.end());
cout << "Sequence after poping from heap:\n";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
return 0;
}
// 最小値と最大値を探す
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< int> v(5);
int i;
v[0] = 100;
v[1] = -4;
v[2] = 55;
v[3] = 19;
v[4] = 122;
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
cout << "Maximum element is: ";
cout << *max_element(v.begin(), v.end());
cout << "\n";
cout << "Minimum element is: ";
cout << *min_element(v.begin(), v.end());
return 0;
}
#include
#include
using namespace std;
int main()
{
vector v;
int i;
for(i=0; i<10; i++) v.push_back(i);
cout << "Contents of v: ";
for(i=0; i< v.size(); i++)
cout >< v[i] << " ";
cout << "\n";
return 0;
}
// for_each()を使用する
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
void show(int i)
{
cout << i << " ";
}
int main()
{
vector< int> v;
int i;
for(i=0; i<10; i++) v.push_back(i);
cout << "Contents of v: ";
for_each(v.begin(), v.end(), show);
cout << "\n";
return 0;
}
// 独自のアルゴリズムを作成する
#include < iostream>
#include < vector>
#include < list>
#include < algorithm>
using namespace std;
// 特定の範囲の値を2倍にするアルゴリズム
template< class ForIter>
void times2(ForIter start, ForIter end)
{
while(start != end) {
*start *= 2;
start++;
}
}
int main()
{
int i;
//**************************************
// intのベクタにtimes2を適用する
vector< int> v;
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";
times2(v.begin(), v.end());
cout << "Contents of v doubled: ";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
//**************************************
// floatのリストにtimes2を適用する
list< float> lst;
list< float>::iterator p;
for(i=0; i<5; i++) lst.push_back((float)i*3.1416);
cout << "Initial Contents of lst: ";
for(p=lst.begin(); p!=lst.end(); p++)
cout << *p << " ";
cout << "\n";
times2(lst.begin(), lst.end());
cout << "Contents of lst doubled: ";
for(p=lst.begin(); p!=lst.end(); p++)
cout << *p << " ";
cout << "\n\n";
return 0;
}