天天看點

C++ 中的插入疊代器以及其疊代器擴充卡

C++ 中有三類疊代器,分别是插入疊代器(inserter),反向疊代器(reverse_iterator)和流疊代器.

這裡(vs2003為例)介紹插入疊代器,插入疊代器分别是std::inserter_iterator,std::back_inserter_iterator,std::front_inserter_iterator 三類,對應的疊代器擴充卡應該是

std::inserter,std::back_inserter,std::front_inserter 。

1. std::inserter_iterator(std::inserter)

  // TEMPLATE FUNCTION inserter

template<class _Container,

 class _Iter> inline

 insert_iterator<_Container> inserter(_Container& _Cont, _Iter _Where)

 { // return insert_iterator

 return (std::insert_iterator<_Container>(_Cont, _Where));

 }

這是是正常的插入疊代器擴充卡的實作,我們看到函數需要指定容器類型和容器的開始指針(從那個位置開始插入)傳回了一個按容器和容器疊代器位置構造出來的疊代器。我們以一個調用例子來說明這個。

std::vector<std::string> v1,v2;

 std::copy(v1.begin(),v1.end(),std::inserter(v2,v2.begin()));

這裡表示需要把v1的所有元素插入到v2裡面。調用的時序是先構造一個std::inserter 的執行個體A(命名為A),然後通過 std::copy 裡面的循環,不斷的調用擴充卡A的指派運算符号,将v1 裡面的元素指派給v2。我們來看 std::insert_iterator 的實作,

template<class _Container>

 class insert_iterator

  : public _Outit

 { // wrap inserts into container as output iterator

public:

 typedef _Container container_type;

 typedef typename _Container::reference reference;

 insert_iterator(_Container& _Cont, typename _Container::iterator _Where)

  : container(&_Cont), iter(_Where)

  { // construct with container and iterator

  }

 insert_iterator<_Container>& operator=(

  typename _Container::const_reference _Val)

  { // insert into container and increment stored iterator

  iter = container->insert(iter, _Val);

  ++iter;

  return (*this);

//...省略了insert_iterator其他的函數

看到

insert_iterator<_Container>& operator=(

這裡通過傳入容器和容器的疊代器,先構造了執行個體,指派運算符實際是調用了容器的 container->insert 方法,是以,這裡必須需要容器有insert 方法。幸好,幾乎所有容器都有insert 方法,是以這個是通用的疊代器。這個insert 方法還必須類似這樣聲明:

iterator insert(iterator _Where, const _Ty& _Val);

傳回一個疊代器,傳入位置和值。  

2. std::back_inserter_iterator(std::back_inserter)

顧名思義,back_inserter就是在容器的後面插入,實際 back_inserter 的實作和 inserter 基本一樣,因為是指定在最後面插入,是以不需要指定插入容易的開始疊代器;

template<class _Container> inline

 back_insert_iterator<_Container> back_inserter(_Container& _Cont)

 { // return a back_insert_iterator

 return (std::back_insert_iterator<_Container>(_Cont));

我們來看  std::back_insert_iterator 的實作,

   // TEMPLATE CLASS back_insert_iterator

 class back_insert_iterator

 { // wrap pushes to back of container as output iterator

 explicit back_insert_iterator(_Container& _Cont)

  : container(&_Cont)

  { // construct with container

 back_insert_iterator<_Container>& operator=(

  { // push value into container

  container->push_back(_Val);

//...省略了back_insert_iterator其他的函數

我們同樣通過一個調用來看,

 std::vector<std::string> v1,v2;

std::copy(v1.begin(),v1.end(),std::back_inserter(v2));

這裡通過傳入容器,先構造了執行個體,指派運算符實際是調用了容器的 container->push_back 方法,是以,這裡必須需要容器有push_back 方法,是以這個對關聯容器 std::map,std::muitlmap 就無效了。

3. std::front_inserter_iterator(std::front_inserter)

顧名思義,front_inserter 就是在容器的前面插入,實際 front_inserter 的實作和 back_inserter 基本一樣,因為是指定在最前面插入,是以不需要指定插入容易的開始疊代器;

// TEMPLATE FUNCTION front_inserter

 front_insert_iterator<_Container> front_inserter(_Container& _Cont)

 { // return front_insert_iterator

 return (std::front_insert_iterator<_Container>(_Cont));

我們來看  std::front_insert_iterator 的實作,

  // TEMPLATE CLASS front_insert_iterator

 class front_insert_iterator

 { // wrap pushes to front of container as output iterator

 explicit front_insert_iterator(_Container& _Cont)

 front_insert_iterator<_Container>& operator=(

  container->push_front(_Val);

//...省略了front_insert_iterator其他的函數

 我們同樣通過一個調用來看,

std::list<std::string> list_1,list_2;

std::copy(v1.begin(),v1.end(),std::front_inserter(list_2));

這裡通過傳入容器,先構造了執行個體,指派運算符實際是調用了容器的 container->push_front 方法,是以,這裡就要求容器必須有 push_front 方法,是以這個對關聯容器 std::map,std::muitlmap,std::vector 都無效了,

這個對于std::deque,std::queue,std::list 這類有先後順序的比較有效了。