イテレータアダプタ

  • reverse_iterator:
如下图,end()rbegin()两个迭代器内部的指针起始是一样的,区别在于方向不同,导致取的值不同;
因此通过调用reverse_iterator的构造函数,将正向迭代器保存到cunrrent中,当真正调用*++等等成员函数时,对保存的current加以改造

使用方式:
vector<int> v;
...
v.rbegin(); //就会得到v.end()的逆行迭代器,对rbegin()进行操作时,实际底层是在v.end()(即current)的操作基础上进行改造

ここに画像の説明を挿入します


  • インサーターイテレーター:3つの挿入イテレーターがあります:inserter(c、it); back_inserter©、front_inserter©;
    それらはすべてデータメンバーを使用して基になるコンテナーcを保存し(インサーターは追加の挿入位置も保存します)、オーバーロード演算子=、Whenこれらの3つのイテレーターに値を割り当てると、insert、push_back、push_frontがそれぞれ基になるコンテナーで呼び出されます。他の++、*および他の操作の場合、back_insert_iterator自体を直接返すだけで、他には何もしません。
下图中在copy算法中对第三参数resuly做的事情:*, =, ++操作
operator*不做任何事情,直接返回本身
operator=会对底层容器调用insert操作
operator++不做任何事情,直接返回本身

ここに画像の説明を挿入します

  • stream_iterator:istream_iterator和ostream_iteraor
//调用ostream_iterator的构造函数,将输出流cout和分隔符,保存在其数据成员中
//当对ostream_iterator做赋值操作时,ostream_iterator重载的operator=内作cout << *first; cout << ",";操作
ostream_iterator<int> out_it(cout, ","); 

如下图,operator*,operator++同样不做任何事情,只有operator=内分别对保存的数据成员调用<<

ここに画像の説明を挿入します

istream_iterator<double> eos;//iit==eos代表输入结束了
istream_iterator<double> iit(cin);

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/jiuri1005/article/details/114630562