C ++イテレータアダプタのSTL_4

ここでは、3つのイテレータアダプタをご紹介します:

  1. 配置タイプイテレータ
  2. フローイテレータ
  3. リバースイテレータ型

配置反復子を入力
ターゲット・コンテナ・スペースの問題、対象コンテナ需要増加の大きさの問題を解決します。

back_inserter()以下のために、コンテナの最後に置かれvectot,deque,listた容器:

#include<iostream>
#include<vector>
#include<algorithm>
#include <iterator>
using namespace std;
typedef vector<int> Vector;
typedef Vector::iterator Iterator;
int main()
{
	Vector vec,vec_1,vec_2;
	for(int i = 0;i <= 10;i++)
		vec.push_back(rand() % 10);
	cout << "生成的序列vec:" << endl;
	for (auto tp : vec)
		cout << tp << " ";
	cout << endl;
	copy(vec.begin(),vec.end(),back_inserter(vec_1));
	copy(vec_1.begin(), vec_1.end(), back_inserter(vec_2));
	cout << endl;
	cout << "生成的序列vec_1:" << endl;
	copy(vec_1.begin(), vec_1.end(), ostream_iterator<int>(cout, " "));
	cout << endl << "生成的序列vec_2:" << endl;
	copy(vec_2.begin(), vec_2.end(), ostream_iterator<int>(cout, " "));
	return 0;
}

結果の実装
ここに画像を挿入説明
使用してback_inserter()内部コールがあるという事実push_back()、コンテナの末尾に要素を追加します。

カバーされていない例:

#include<iostream>
#include<vector>
#include<algorithm>
#include <iterator>
using namespace std;
typedef vector<int> Vector;
typedef Vector::iterator Iterator;
int main()
{
	Vector vec,vec_1,vec_2;
	for(int i = 0;i <= 10;i++)
		vec.push_back(rand() % 10);
	cout << "生成的序列vec:" << endl;
	for (auto tp : vec)
		cout << tp << " ";
	cout << endl;
	copy(vec.begin(),vec.end(),back_inserter(vec_1));
	for (int i = 0; i <= 10; i++)
		vec_2.push_back(rand() % 10);
	cout << "生成的序列vec_2:" << endl;
	copy(vec_2.begin(), vec_2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	copy(vec_2.begin(), vec_2.end(), back_inserter(vec_1));
	cout << "生成的序列vec_1:" << endl;
	copy(vec_1.begin(), vec_1.end(), ostream_iterator<int>(cout, " "));
	return 0;
}

結果の実装
ここに画像を挿入説明

front_inserter()容器list`、両端キューのために、コンテナヘッダ内に置か。

#include<iostream>
#include<list>
#include<algorithm>
#include <iterator>
using namespace std;
typedef list<int> List;
typedef List::iterator Iterator;
int main()
{
	List vec,vec_1,vec_2;
	for(int i = 0;i <= 10;i++)
		vec.push_back(rand() % 10);
	cout << "生成的序列vec:" << endl;
	for (auto tp : vec)
		cout << tp << " ";
	cout << endl;
	copy(vec.begin(),vec.end(),back_inserter(vec_1));
	for (int i = 0; i <= 10; i++)
		vec_2.push_back(rand() % 10);
	cout << "生成的序列vec_2:" << endl;
	copy(vec_2.begin(), vec_2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	copy(vec_2.begin(), vec_2.end(), front_inserter(vec_1));
	cout << "生成的序列vec_1:" << endl;
	copy(vec_1.begin(), vec_1.end(), ostream_iterator<int>(cout, " "));
	return 0;
}

結果の実装
ここに画像を挿入説明
この操作が挿入されることに注意してください、逆の順序で挿入されています。

inserter(container,pos)一般的なタイプは、容器に挿入されpos、配置要素の位置、要素及び一貫した配置順の並び順。すべてのコンテナは、この機能を有しますinserter

#include<iostream>
#include<list>
#include<algorithm>
#include <iterator>
using namespace std;
typedef list<int> List;
typedef List::iterator Iterator;
int main()
{
	List vec,vec_1,vec_2;
	for(int i = 0;i <= 10;i++)
		vec.push_back(rand() % 10);
	cout << "生成的序列vec:" << endl;
	for (auto tp : vec)
		cout << tp << " ";
	cout << endl;
	copy(vec.begin(),vec.end(),inserter(vec_1,vec_1.begin()));
	cout << "生成的序列vec_1:" << endl;
	copy(vec_1.begin(), vec_1.end(), ostream_iterator<int>(cout, " "));
	return 0;
}

結果の実装
ここに画像を挿入説明


イテレータフロー
ファイルの読み込みが終了するまで、標準入力から全ての単語としての機能を。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <iterator>
using namespace std;
int main()
{
	vector<int> vec;
	copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(vec));
	copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
	return 0;
}

結果の実装
ここに画像を挿入説明
istream_iterator<int>(cin)
同等の機能cin >>

istream_iterator<int>()
生成には、「終了文字ストリーム」平均何を読み取ることができないイテレータを表します。

back_inserter(vec)
ではcopy場合、データ(からcin)にコピーvec容器


逆型イテレータ
すなわち逆関数

#include<iostream>
#include<vector>
#include<algorithm>
#include <iterator>
using namespace std;
typedef vector<int> Vector;
typedef Vector::iterator Iterator;
int main()
{
	Vector vec;
	for(int i = 0;i <= 10;i++)
		vec.push_back(rand() % 10);
	cout << "生成的序列vec:" << endl;
	copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
	cout << endl << "逆序后" << endl;
	copy(vec.rbegin(), vec.rend(), ostream_iterator<int>(cout, " "));
	return 0;
}

結果、元にポイントの位置、元のポイントの位置。
ここに画像を挿入説明
rbegin()end()rend()begin()

公開された222元の記事 ウォン称賛48 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_44116998/article/details/104575055