// insert_iteratorの使用例
#include < iostream>
#include < iterator>
#include < vector>
using namespace std;
int main()
{
vector< int> v;
vector< int>::iterator itr;
int i;
for(i=0; i<5; i++)
v.push_back(i);
cout << "Original contents of v: ";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
cout << endl;
itr = v.begin();
itr += 2; // 2番目の要素を指す
// insert_iteratorを要素2に作成する
insert_iterator< vector< int> > i_itr(v, itr);
// 上書きではなく、挿入が行われる
*i_itr++ = 100;
*i_itr = 200;
cout << "v after insertion: ";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
return 0;
}
// 挿入反復子を使ってベクタをほかのベクタに挿入する
#include < iostream>
#include < iterator>
#include < vector>
#include < string>
using namespace std;
int main()
{
vector< string> v, v2;
vector< string>::iterator itr;
v.push_back("The");
v.push_back("STL");
v.push_back("are");
v.push_back("powerful.");
v2.push_back("and");
v2.push_back("insert");
v2.push_back("iterators");
cout << "Original size of v: " << v.size() << endl;
cout << "Original contents of v:\n";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
cout << "\n\n";
// v2を挿入する
copy(v2.begin(), v2.end(), inserter(v, v.begin()+2));
cout << "Size of v after insertion: ";
cout << v.size() << endl;
cout << "Contents of v after insertion:\n";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
return 0;
}
// back_insert_iteratorの使用例
#include < iostream>
#include < iterator>
#include < vector>
using namespace std;
int main()
{
vector< int> v, v2;
vector< int>::iterator itr;
int i;
for(i=0; i<5; i++)
v.push_back(i);
cout << "Original contents of v: ";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
cout << endl;
// vに対してback_insert_iteratorを作成する
back_insert_iterator< vector< int> > bck_i_itr(v);
// 上書きではなく、挿入が行われる
*bck_i_itr++ = 100;
*bck_i_itr = 200;
cout << "v after insertion: ";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
cout << endl;
cout << "Size of v2 before copy: " << v2.size()
<< endl;
// back_inserter()を使ってvをv2にコピーする
copy(v.begin(), v.end(), back_inserter(v2));
cout << "Size of v2 after copy: " << v2.size()
<< endl;
cout << "Contents of v2 after insertion: ";
itr = v2.begin();
while(itr != v2.end())
cout << *itr++ << " ";
return 0;
}
// front_insert_iteratorの使用例
#include < iostream>
#include < iterator>
#include < list>
using namespace std;
int main()
{
list< int> v, v2;
list< int>::iterator itr;
int i;
for(i=0; i<5; i++)
v.push_back(i);
cout << "Original contents of v: ";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
cout << endl;
// vに対してfront_insert_iteratorを作成する
front_insert_iterator< list< int> > frnt_i_itr(v);
// 上書きではなく、挿入が行われる
*frnt_i_itr++ = 100;
*frnt_i_itr = 200;
cout << "v after insertion: ";
itr = v.begin();
while(itr != v.end())
cout << *itr++ << " ";
cout << endl;
cout << "Size of v2 before copy: " << v2.size()
<< endl;
// front_inserter()を使ってvをv2にコピーする
copy(v.begin(), v.end(), front_inserter(v2));
cout << "Size of v2 after copy: " << v2.size()
<< endl;
cout << "Contents of v2 after insertion: ";
itr = v2.begin();
while(itr != v2.end())
cout << *itr++ << " ";
return 0;
}
// istream_iteratorを使ってさまざまなデータ型を読み取る
#include < iostream>
#include < iterator>
#include < string>
#include < vector>
using namespace std;
int main()
{
int i;
double d;
string str;
vector< int> vi;
vector< double> vd;
vector< string> vs;
cout << "Enter some integers, enter 0 to stop.\n";
istream_iterator< int> int_itr(cin);
do {
i = *int_itr; // 次のintを読み取る
if(i != 0) {
vi.push_back(i); // それを保存する
++int_itr; // 次のintを入力する
}
} while (i != 0);
cout << "Enter some doubles, enter 0 to stop.\n";
istream_iterator< double> double_itr(cin);
do {
d = *double_itr; // 次のdoubleを読み取る
if(d != 0.0) {
vd.push_back(d); // それを保存する
++double_itr; // 次のdoubleを入力する
}
} while (d != 0.0);
cout << "Enter some strings, enter 'quit' to stop.\n";
istream_iterator< string> string_itr(cin);
do {
str = *string_itr; // 次の文字列を読み取る
if(str != "quit") {
vs.push_back(str); // それを保存する
++string_itr;
}
} while (str != "quit"); // 次の文字列を入力する
cout << "Here is what you entered:\n";
for(i=0; i< vi.size(); i++)
cout << vi[i] << " ";
cout << endl;
for(i=0; i< vd.size(); i++)
cout << vd[i] << " ";
cout << endl;
for(i=0; i< vs.size(); i++)
cout << vs[i] << " ";
return 0;
}
// istream_iteratorをcopyアルゴリズムで使用する
#include < iostream>
#include < iterator>
#include < algorithm>
#include < vector>
using namespace std;
int main()
{
int i;
vector< int> v(5);
cout << "Enter 5 integers: \n";
istream_iterator< int> int_itr(cin);
copy(int_itr, istream_iterator(), v.begin());
cout << "Here are the values you entered: ";
for(i=0; i< v.size(); i++) cout << v[i] << " ";
return 0;
}
// ostream_iteratorを使用する
#include < iostream>
#include < iterator>
using namespace std;
int main()
{
ostream_iterator< char> out_it(cout);
*out_it = 'X';
out_it++;
*out_it = 'Y';
out_it++;
*out_it = ' ';
char str[] = "C++ Iterators are powerful.\n";
char *p = str;
while(*p) *out_it++ = *p++;
ostream_iterator< double> out_double_it(cout);
*out_double_it = 187.23;
out_double_it++;
*out_double_it = -102.7;
return 0;
}
// ostream_iteratorを使用する
#include < iostream>
#include < list>
#include < iterator>
#include < string>
#include < algorithm>
using namespace std;
int main()
{
list< string> lst;
ostream_iterator< string> out_it(cout);
lst.push_back("Stream ");
lst.push_back("iterators ");
lst.push_back("are ");
lst.push_back("useful.");
copy(lst.begin(), lst.end(), out_it);
return 0;
}
/* istreambuf_iterator、ostreambuf_iterator、およびreplace_copy()を使って
ファイルをフィルタ処理する */
#include < iostream>
#include < fstream>
#include < iterator>
#include < algorithm>
using namespace std;
int main(int argc, char *argv[])
{
if(argc!=3) {
cout << "Usage: replace in out\n";
return 1;
}
ifstream in(argv[1]);
ofstream out(argv[2]);
// ファイルが開いたことを確認する
if(!in) {
cout << "Cannot open input file.\n";
return 1;
}
if(!out) {
cout << "Cannot open output file.\n";
return 1;
}
// ストリーム反復子を作成する
istreambuf_iterator< char> in_itr(in);
ostreambuf_iterator< char> out_itr(out);
// 文字を置き換えながらファイルをコピーする
replace_copy(in_itr, istreambuf_iterator< char>(),
out_itr, ' ', '|');
in.close();
out.close();
return 0;
}
// advance()とdistance()の使用例
#include < iostream>
#include < list>
#include < iterator>
using namespace std;
int main()
{
list< char> lst;
list< char>::iterator p;
int i;
for(i=0; i<10; i++) lst.push_back('A'+i);
p = lst.begin();
cout << "Character at p: " << *p << endl;
// advance()を使って2文字分だけ前方へ移動する
// p += 2; // listに対しては不可
advance(p, 2); // これなら許される
cout << "Character at p+2: " << *p << endl;
// distance()の使用例
cout << "Number of elements from lst.begin() ";
cout << "to lst.end(): ";
// cout << lst.end()-lst.begin(); // 不可
cout << distance(lst.begin(), lst.end());
return 0;
}