10.4イテレータ再訪
ヘッダ標準ライブラリイテレータ、コンテナを定義するイテレータ加えて、だけでなく、いくつかの追加のイテレータを定義します。
- 挿入反復子挿入反復子
- イテレータは、ストリームierator流れ
- イテレータリバースイテレータをリバース
- 反復子を移動
その後、各反復を要約すると、何をするか、具体的です
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++;
}