C ++入門章X 10.4再訪イテレータの練習と概要

10.4イテレータ再訪

ヘッダ標準ライブラリイテレータ、コンテナを定義するイテレータ加えて、だけでなく、いくつかの追加のイテレータを定義します。

  1. 挿入反復子挿入反復子
  2. イテレータは、ストリームierator流れ
  3. イテレータリバースイテレータをリバース
  4. 反復子を移動

その後、各反復を要約すると、何をするか、具体的です

10.4.1挿入反復子

反復子が挿入イテレータアダプタ容器を受け取り、生成された反復子、反復が割り当てられ、容器はイテレータ操作呼び出し容器に追加する要素の割り当て

イテレータは3を持って挿入します。
1.back_inserter
2.front_inserter
3.inserter

backi_inserter一backコール容器()オペレーション、コンテナが一back()動作していることを条件とする、素子が後に添加される配列

front_inserter()push_frontコール容器()オペレーションは、容器はpush_front()オペレーションを有することを提供追加した後、元素を逆の順序を

要素が後に添加されるように、指定された要素への挿入要素の前に、動作点挿入し、容器及び挿入物の位置を特定するための挿入()必要配列

反復子が操作をサポート挿入します。
ここに画像を挿入説明
唯一の割り当てに便利、残り実際に操作を返すイテレータ自身に挿入されています。

練習

10.26
指摘違いは何ですか、それに書き出されています

10.27

vector<string> vec = { "a","c","a","e123","1ca","aaa","aaa","z123","q","casd123","asdas" };
	deque<string> dq;
	
	std::sort(vec.begin(),vec.end());
	std::unique_copy(vec.begin(),vec.end(),std::back_inserter(dq));
	for (const auto& item:dq) {
		cout << item << endl;
	}

	cout << "size:" << dq.size() << endl;

10.28
エラーログ:ここで私は)イテレータを使用して各割り当てアルゴリズムに渡されたがそのように(開始着信インサータ、一度呼ばれていることを、ミスを犯した、最初の要素が挿入される前に、各時間、そして挿入された要素それを逆にではなく、実際には、通話を開始する場合にのみ()要素を指していない、または最初または次の位置の最後の要素は、他の要素を挿入した後、それはもはや最初の要素です。

vector<int> vec = {1,2,3,4,5,6,7,8,9};
	vector<int> vec_1;
	list<int> lst_1;
	deque<int> dq_1;
	//顺序
	std::copy(vec.begin(), vec.end(), std::back_inserter(vec_1));
	//逆序
	std::copy(vec.begin(), vec.end(), std::front_inserter(lst_1));
	//这是顺序。。。= =
	std::copy(vec.begin(),vec.end(),std::inserter(dq_1,dq_1.begin()));

	for (const auto& item:vec_1) {
		cout << item << std::ends;
	}
	cout << endl;
	for (const auto& item : lst_1) {
		cout << item << std::ends;
	}
	cout << endl;
	for (const auto& item : dq_1) {
		cout << item << std::ends;
	}
	cout << endl;

10.4.2 iostreamのイテレータ

IOライブラリは、イテレータのタイプのための標準を定義します。
1.istream_iteratorの
2.ostream_iterator

istream_iterator操作

ここに画像を挿入説明
デフォルトの初期化は、イテレータの終了後と言った場合、ストリームオブジェクトに渡すことができ、初期化時に、イテレータ型を指定するistream_iteratorの必要性を作成する、あなたはまた、デフォルトの初期化を使用することができます。あなたはストリームオブジェクトを渡すと、ストリームからデータを読み込みます。

一般istream_iteratorのための操作手順:

std::istream_iterator<int> int_input(cin);
	std::istream_iterator<int> eof;
	vector<int> vec;
	while (int_input!=eof) {
		 vec.push_back(*int_input++);
	}

*イーターは、++ ITERを使用し、エレメンタリストリームを取得イテレータの次の要素から読み取るために使用されます。

どのように使用するには
、我々はいくつかのアルゴリズムでistream_iterator使用することができます。

istream_iterator<int> in(cin),eof;
cout<<accumulate(in,eof,9)<<endl;

アルゴリズムは、標準入力から値を読み出します。

私たちは、ストリームへのイテレータは、バインディングストリームを使用する場合、イテレータは必ずしもすぐにストリームからデータを読み取るされていない、あなたはまた、再読み込みを呼び出すことができます。
実際のコードが指定されているいいえ、私はこれが意味するのは良いを理解していませんがあります

ostream_iterator

ここに画像を挿入説明
初期設定ではostream_iterator、オブジェクトをバインドする必要があり、そしてCスタイルの文字列を追加することができ、その文字列は、各出力に追加されます。

直接ITER =値は、出力データをストリームにバインドすることができます。
* ITER、ITER ++、ITER ++ 、 自分自身のリターンがあります。

役に立たないが、一般的にそれは過ごすために推奨されるこれらの3つの操作が統一されたスタイルを維持することですが、イテレータが変更された場合、1は、修正プログラムの程度は大きくないです。

具体的な動作は、練習を参照してください

フローイテレータの場合は、クラス型限り、istream_iteratorを上書きするために使用することができます>>、<<あれば使用ostream_iteratorことができるようにオーバーロードされました。

練習

10.29

std::ifstream fin("phone.txt");
	//需要指定对象的类型
	std::istream_iterator<string> in_iter(fin);
	// 尾后迭代器
	std::istream_iterator<string> eof;
	vector<string> str_vec;
	while (in_iter!=eof) {
		str_vec.push_back(*in_iter++);
	}
	std::ostream_iterator<string> out_iter(cout," ");
	for (const auto& item:str_vec) {
		*out_iter++ = item;
	}

10.30

vector<string> vec = { "a","c","a","e123","1ca","aaa","aaa","z123","q","casd123","asdas" };
	std::istream_iterator<int> int_input(cin);
	std::istream_iterator<int> eof;
	//std::sort();
	vector<int> vec;
	while (int_input!=eof) {
		 vec.push_back(*int_input++);
	}
	std::ostream_iterator<int> int_output(cout," ");
	std::sort(vec.begin(),vec.end());
	std::copy(vec.begin(), vec.end(), int_output);
	//std::unique_copy(vec.begin(), vec.end(), int_output);

10.31

	std::unique_copy(vec.begin(), vec.end(), int_output);

10.32

いいえソースセクションなかっ1.6、演算子のオーバーロードを修正するためのフォローアップ調査



10.33

std::ifstream f("data.txt");
	std::istream_iterator<int> f_input(f),eof;
	std::ofstream file1("jishu.txt"), file2("oushu.txt");
	std::ostream_iterator<int> out_iter_1(file1," "),out_iter_2(file2,"\n");
	while (f_input!=eof) {
		if (*f_input%2==1) {
			*out_iter_1++ = *f_input;
		}
		else {
			*out_iter_2++ = *f_input;
		}
		f_input++;
	}
公開された38元の記事 ウォンの賞賛6 ビュー2694

おすすめ

転載: blog.csdn.net/zengqi12138/article/details/104316536