STLのイテレータアダプタ(イテレータアダプタ)

イテレータアダプタ

グラフLRイテレータ--- reverse_iteratorイテレータ--- Insert_iteratorイテレータ--- iostream_iterator Insert_iterator --- back_insert_iterator Insert_iterator --- front_insert_iterator Insert_iterator --- insert_iterator

イテレータを挿入:割り当て変更は、一般的に、イテレータ挿入操作です。

イテレータを挿入

割り当てのためのイテレータインサータユーザは、それが挿入イテレータクラスで定義された下層の容器演算子()を挿入する操作(一back、push_front、挿入など)を呼び出したとき。

反復アダプタインサートback_inserter例において:(front_inserterと、そのクラスに似て挿入)

template <class _Container>
inline back_insert_iterator<_Container> back_inserter(_Container& __x) {
  return back_insert_iterator<_Container>(__x);
}

場合コンストラクタに渡されたパラメータの後関数は、実際の挿入イテレータクラス(back_insert_iterator)オブジェクトを返すback_inserter機能、ユーザ呼び出し、コンテナはイテレータクラスを挿入します。挿入反復子クラスコード(back_insert_iterator)後:

template <class _Container>
class back_insert_iterator {
protected:
  _Container* container;
public:
  typedef _Container          container_type;
  typedef output_iterator_tag iterator_category;
  typedef void                value_type;
  typedef void                difference_type;
  typedef void                pointer;
  typedef void                reference;

  explicit back_insert_iterator(_Container& __x) : container(&__x) {}
  back_insert_iterator<_Container>&
  operator=(const typename _Container::value_type& __value) { 
    container->push_back(__value);
    return *this;
  }
  back_insert_iterator<_Container>& operator*() { return *this; }
  back_insert_iterator<_Container>& operator++() { return *this; }
  back_insert_iterator<_Container>& operator++(int) { return *this; }
};

コンテナクラスのクラスポインタ_Container *コンテナ、ポイントを挿入する容器。コンテナのクラス代入演算子=、関数呼び出し一back底部、容器のオペレータ=パラメーター__value挿入端で定義されています。

クラスイテレータがオーバーロードされている演算子:間接参照[*]、prefix_increment []、post_increment [(INT)]。単に現在の反復自体を返す関数(*本)の本体ではなく、例えば前進、対応する操作では、そのようなback_insert_iteratorの目的は、上記の動作は、任意の効果はありませんです。

例と分析:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>

using namespace std;

int main(){
	int ia[]={1,5,3,6,4,8,9};
	vector<int> ivec(ia,ia+7);
	ostream_iterator<int> outite(cout," ");

	copy(ia,ia+3,back_inserter(ivec));        //a
	copy(ivec.begin(),ivec.end(),outite);
        //1 5 3 6 4 8 9 1 5 3
	cout<<endl;

	return 0;
}

 Back_inserterプログラムラインはIVECイテレータオブジェクト(back_insert_iteratorオブジェクト)の後にベクターを生成するために、関数を呼び出して、コピーアルゴリズムにオブジェクトを渡します。処理のために容器内のオブジェクトの関数としてコピーアルゴリズムにおけるこのオブジェクトに。プログラムでは、後にだけ従って、[間接参照である、目的関数ではなく、アレイ内のアクセス要素に伝統的な反復子よりも、容器を提供する呼び出しに使用イテレータオブジェクト(ファンクタ)の関数として使用されています*]、prefix_increment []、post_increment [(INT)]操作は、任意の結果が得られないであろう。

プログラムの結果を実行することである:。3. 5. 6. 4. 8 1. 9 。1 5 3

おすすめ

転載: www.cnblogs.com/SupremeGIS-Developer/p/11964352.html