// vectorの使用例
#include < iostream>
#include < vector>
using namespace std;
int main()
{
vector< int> v(10); // 長さ10のベクタを作成する
int i;
// vの元の大きさを表示する
cout << "Size = " << v.size() << endl;
// ベクタの各要素に値を代入する
for(i=0; i< 10; i++) v[i] = i;
// ベクタの要素を表示する
cout << "Current Contents:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << "\n\n";
cout << "Expanding vector\n";
// ベクタの最後に値を追加すると、ベクタは必要に応じて拡大する
for(i=0; i< 5; i++) v.push_back(i + 10);
// の現在の大きさを表示する
cout << "Size now = " << v.size() << endl;
// ベクタの要素を表示する
cout << "Current contents:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << "\n\n";
// ベクタの要素を変更する
for(i=0; i< v.size(); i++) v[i] = -v[i];
cout << "Modified Contents:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << endl;
return 0;
}
// pop_back()とempty()を使用する
#include < iostream>
#include < vector>
using namespace std;
int main()
{
vector< char> v;
int i;
for(i=0; i<10; i++)
v.push_back(i + 'A');
cout << "Vector's original contents:\n";
for(i=0; i < v.size(); i++)
cout << v[i] << " ";
cout << "\n\n";
do {
v.pop_back(); // 末尾から要素を削除する
cout << "Vector now contains:\n";
for(i=0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
} while(!v.empty());
return 0;
}
// 反復子を介してベクタの要素にアクセスする
#include < iostream>
#include < vector>
using namespace std;
int main()
{
vector< int> v(10); // 長さ10のベクタを作成する
vector< int>::iterator p; // 反復子を作成する
int i;
// ベクタの要素に値を代入する
p = v.begin();
i = 0;
while(p != v.end()) {
*p = i; // pを介してvにiを書き込む
p++; // 反復子を進める
i++;
}
// ベクタの要素を表示する
cout << "Original contents:\n";
p = v.begin();
while(p != v.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
// ベクタの要素を変更する
p = v.begin();
while(p != v.end()) {
*p = *p * 2;
p++;
}
// ベクタの要素を表示する
cout << "Modified Contents:\n";
p = v.begin();
while(p != v.end()) {
cout << *p << " ";
p++;
}
cout << endl;
return 0;
}
// end()を理解する
#include < iostream>
#include < vector>
using namespace std;
int main()
{
vector< int> v; // 空のベクタを作成する
int i;
for(i=0; i<10; i++) v.push_back(i);
cout << "Vector printed forwards:\n";
vector< int>::iterator p = v.begin();
while(p != v.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
cout << "Vector printed backwards:\n";
p = v.end();
while(p != v.begin()) {
p--; // 使用する前に反復子をデクリメントする
cout << *p << " ";
}
return 0;
}
// 挿入と削除の例
#include < iostream>
#include < vector>
using namespace std;
int main()
{
vector< char> v(10);
vector< char> v2;
char str[] = "< Vector>";
int i;
// vを初期化する
for(i=0; i<10; i++) v[i] = i + 'a';
// str内の文字をv2にコピーする
for(i=0; str[i]; i++) v2.push_back(str[i]);
// ベクタの元の内容を表示する
cout << "Original contents of v:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << "\n\n";
vector< char>::iterator p = v.begin();
p += 2; // 3番目の要素を指す
// vに10個のXを挿入する
v.insert(p, 10, 'X');
// 挿入後の要素を表示する
cout << "Size after inserting X's = " << v.size() << endl;
cout << "Contents after insert:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << "\n\n";
// これらの要素を削除する
p = v.begin();
p += 2; // 3番目の要素を指す
v.erase(p, p+10); // 次の10個の要素を削除する
// 削除後の要素を表示する
cout << "Size after erase = " << v.size() << endl;
cout << "Contents after erase:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << "\n\n";
// v2をvに挿入する
v.insert(p, v2.begin(), v2.end());
cout << "Size after v2's insertion = ";
cout << v.size() << endl;
cout << "Contents after insert:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << endl;
return 0;
}
// listを使用する
#include < iostream>
#include < list>
using namespace std;
int main()
{
list< int> lst; // 空のlistを作成する
int i;
for(i=0; i<10; i++) lst.push_back(i);
cout << "Size = " << lst.size() << endl;
cout << "Contents: ";
list< int>::iterator p = lst.begin();
while(p != lst.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
// listの要素を変更する
p = lst.begin();
while(p != lst.end()) {
*p = *p + 100;
p++;
}
cout << "Contents modified: ";
p = lst.begin();
while(p != lst.end()) {
cout << *p << " ";
p++;
}
return 0;
}
// リストの結合とマージを行う
#include < iostream>
#include < list>
using namespace std;
int main()
{
list< char> lst1, lst2, lst3;
int i;
for(i=0; i<10; i+=2) lst1.push_back(i + 'A');
for(i=1; i<11; i+=2) lst2.push_back(i + 'A');
cout << "Contents of lst1:\n";
list< char>::iterator p = lst1.begin();
while(p != lst1.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
cout << "Contents of lst2:\n";
p = lst2.begin();
while(p != lst2.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
// 2つのリストをマージする
lst1.merge(lst2);
if(lst2.empty())
cout << "lst2 is now empty\n";
cout << "Contents of lst1 after merge:\n";
p = lst1.begin();
while(p != lst1.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
// push_front()を使ってほかのリストを作成する
char str[] = "-splicing-";
for(i=0; str[i]; i++) lst3.push_back(str[i]);
cout << "Contents of lst3:\n";
p = lst3.begin();
while(p != lst3.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
// 2つのリストを結合する
p = lst1.begin();
while(p != lst1.end()) {
if(*p == 'F') lst1.splice(p, lst3);
p++;
}
cout << "Contents of lst1 after splice:\n";
p = lst1.begin();
while(p != lst1.end()) {
cout << *p << " ";
p++;
}
return 0;
}
// push_back()とpush_front()の違いを示すコード
#include < iostream>
#include < list>
using namespace std;
int main()
{
list< int> lst1, lst2;
int i;
for(i=0; i<10; i++) lst1.push_back(i);
for(i=0; i<10; i++) lst2.push_front(i);
list< int>::iterator p;
cout << "Contents of lst1:\n";
p = lst1.begin();
while(p != lst1.end()) {
cout << *p << " ";
p++;
}
cout << "\n\n";
cout << "Contents of lst2:\n";
p = lst2.begin();
while(p != lst2.end()) {
cout << *p << " ";
p++;
}
return 0;
}
// count()の使用例
#include < iostream>
#include < vector>
#include < cstdlib>
#include < algorithm>
using namespace std;
int main()
{
vector< bool> v;
int i;
for(i=0; i < 10; i++) {
if(rand() % 2) v.push_back(true);
else v.push_back(false);
}
cout << "Sequence:\n";
for(i=0; i< v.size(); i++)
cout << boolalpha << v[i] << " ";
cout << endl;
i = count(v.begin(), v.end(), true);
cout << i << " elements are true.\n";
return 0;
}
// count_if()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
// 数が偶数かどうかを判定する単項述語
bool isEven(int i)
{
return !(i%2);
return false;
}
int main()
{
vector< int> v;
int i;
for(i=1; i < 20; i++) v.push_back(i);
cout << "Sequence:\n";
for(i=0; i< v.size(); i++)
cout << v[i] << " ";
cout << endl;
i = count_if(v.begin(), v.end(), isEven);
cout << i << " numbers are evenly divisible by 2.\n";
return 0;
}
// remove_copy()とreplace_copy()の使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
char str[]="Algorithms operate on containers through iterators.";
vector< char> v, v2(100);
vector< char>::iterator p;
int i;
for(i=0; str[i]; i++) v.push_back(str[i]);
// **** remove_copy()の例 ****
cout << "Input sequence:\n";
for(i=0; i< v.size(); i++) cout << v[i];
cout << endl;
// すべての空白文字を削除する
p = remove_copy(v.begin(), v.end(), v2.begin(), ' ');
cout << "Result after removing spaces:\n";
for(i=0; i< p-v2.begin(); i++) cout << v2[i];
cout << "\n\n";
// **** replace_copy()の例 ****
cout << "Input sequence:\n";
for(i=0; i< v.size(); i++) cout << v[i];
cout << endl;
// 空白文字を+記号に置換する
p = replace_copy(v.begin(), v.end(), v2.begin(), ' ', '+');
cout << "Result after replacing spaces with +'s:\n";
for(i=0; i< p-v2.begin(); i++) cout << v2[i];
cout << "\n\n";
return 0;
}
// reverseの使用例
#include < iostream>
#include < vector>
#include < algorithm>
using namespace std;
int main()
{
vector< int> v;
int i;
for(i=0; i<10; i++) v.push_back(i);
cout << "Initial: ";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << endl;
reverse(v.begin(), v.end());
cout << "Reversed: ";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
return 0;
}
// 変換アルゴリズムの例
#include < iostream>
#include < list>
#include < algorithm>
using namespace std;
// 簡単な変換関数
double reciprocal(double i) {
return 1.0/i; // 逆数を返す
}
int main()
{
list< double> vals;
int i;
// リストに値を入れる
for(i=1; i<10; i++) vals.push_back((double)i);
cout << "Original contents of vals:\n";
list< double>::iterator p = vals.begin();
while(p != vals.end()) {
cout << *p << " ";
p++;
}
cout << endl;
// 値の変換
p = transform(vals.begin(), vals.end(),
vals.begin(), reciprocal);
cout << "Transformed contents of vals:\n";
p = vals.begin();
while(p != vals.end()) {
cout << *p << " ";
p++;
}
return 0;
}
// リストをベクタにコピーする
#include < iostream>
#include < vector>
#include < list>
#include < algorithm>
using namespace std;
int main()
{
vector< char> v(20);
list< char> lst;
int i;
// ベクタを初期化する
for(i=0; i<20; i++) v[i] = 'A' + i;
cout << "Original contents of vector:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
cout << "\n\n";
// リストを初期化する
char str[] = "-STL Power-";
for(i = 0; str[i]; i++) lst.push_back(str[i]);
// lstをvにコピーする
copy(lst.begin(), lst.end(), v.begin());
// 結果の表示する
cout << "Contents of vector after copy:\n";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
return 0;
}
// 単項関数オブジェクトを使用する
#include < iostream>
#include < list>
#include < functional>
#include < algorithm>
using namespace std;
int main()
{
list< double> vals;
int i;
// リストに値を入れる
for(i=1; i<10; i++) vals.push_back((double)i);
cout << "Original contents of vals:\n";
list< double>::iterator p = vals.begin();
while(p != vals.end()) {
cout << *p << " ";
p++;
}
cout << endl;
// negate関数オブジェクトを使用する
p = transform(vals.begin(), vals.end(),
vals.begin(),
negate< double>()); // 関数オブジェクトを使用する
cout << "Negated contents of vals:\n";
p = vals.begin();
while(p != vals.end()) {
cout << *p << " ";
p++;
}
return 0;
}
// 二項関数オブジェクトを使用する
#include < iostream>
#include < list>
#include < functional>
#include < algorithm>
using namespace std;
int main()
{
list< double> vals;
list< double> divisors;
int i;
// リストに値を入れる
for(i=10; i<100; i+=10) vals.push_back((double)i);
for(i=1; i<10; i++) divisors.push_back(3.0);
cout << "Original contents of vals:\n";
list< double>::iterator p = vals.begin();
while(p != vals.end()) {
cout << *p << " ";
p++;
}
cout << endl;
// valsを変換する
p = transform(vals.begin(), vals.end(),
divisors.begin(), vals.begin(),
divides< double>()); // 関数オブジェクトを使用する
cout << "Divided contents of vals:\n";
p = vals.begin();
while(p != vals.end()) {
cout << *p << " ";
p++;
}
return 0;
}