Boolan - C++學習筆記 _STL - 第四周

轉:

插入迭代器,顧名思義,插入用的;比如對于algorithm中的copy函數,

1
2
3
4
5
6
7
8
9
template<class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result; ++first;
  }
  return result;
}
是將[first, last)之間的元素插入到result指向的位置前or后,目標容器空間可能大于、等于或小于 [first, last) 這個范圍,所以對于OutputIterator類型的迭代器,要滿足在++時,空間不溢出(OutputIterator可以是除三種插入迭代器外的其他多種迭代器類型);

對于三種插入迭代器,它們繼承自iterator,同時各自重載了賦值操作符,不同的插入迭代器在賦值操作符中分別調用了push_front,push_back或者insert成員函數,這樣插入迭代器就可以保證目標容器的空間不溢出;

back_insert_iterator:
是在容器的尾部插入元素,調用的是容器的push_back成員函數;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class Container>
  class back_insert_iterator :
    public iterator<output_iterator_tag,void,void,void,void>
{
protected:
  Container* container;

public:
  typedef Container container_type;

  explicit back_insert_iterator (Container& x) : container(std::addressof(x)) {}

  back_insert_iterator<Container>& operator= (const typename Container::value_type& value)
    { container->push_back(value); return *this; }

  back_insert_iterator<Container>& operator= (typename Container::value_type&& value)
    { container->push_back(std::move(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; }
};

front_insert_iterator:
是在容器的頭部插入元素,調用的是容器的push_front成員函數;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class Container>
  class front_insert_iterator :
    public iterator<output_iterator_tag,void,void,void,void>
{
protected:
  Container* container;

public:
  typedef Container container_type;

  explicit front_insert_iterator (Container& x) : container(std::addressof(x)) {}

  front_insert_iterator<Container>& operator= (const typename Container::value_type& value)
    { container->push_front(value); return *this; }

  front_insert_iterator<Container>& operator= (typename Container::value_type&& value)
    { container->push_front(std::move(value)); return *this; }
  front_insert_iterator<Container>& operator* ()
    { return *this; }
  front_insert_iterator<Container>& operator++ ()
    { return *this; }
  front_insert_iterator<Container> operator++ (int)
    { return *this; }
};

insert_iterator:
是在容器的中間插入元素,調用的是容器的insert成員函數;
所以在初始化insert_iterator的時候需要指定要插入的位置;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <class Container>
  class insert_iterator :
    public iterator<output_iterator_tag,void,void,void,void>
{
protected:
  Container* container;
  typename Container::iterator iter;

public:
  typedef Container container_type;

  explicit insert_iterator (Container& x, typename Container::iterator i)
    : container(std::addressof(x)), iter(i) {}

  insert_iterator<Container>& operator= (const typename Container::value_type& value)
    { iter=container->insert(iter,value); ++iter; return *this; }

  insert_iterator<Container>& operator= (typename Container::value_type&& value)
    { iter=container->insert(iter,std::move(value)); ++iter; return *this; }
  insert_iterator<Container>& operator* ()
    { return *this; }
  insert_iterator<Container>& operator++ ()
    { return *this; }
  insert_iterator<Container> operator++ (int)
    { return *this; }
};


template <class Container, class Iterator>
  insert_iterator<Container> inserter (Container& x, Iterator it);
template <class Container>
  front_insert_iterator<Container> front_inserter (Container& x);
template <class Container>
  back_insert_iterator<Container> back_inserter (Container& x);
分別用來產生三種插入迭代器;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容