STL源码剖析(9):Iterator adaptor

配接器(adaptor)在STL组件的灵活组合运用功能上,扮演者轴承、转换器的角色。

配机器分类:container adapters,iterator adapters,functor adapters。

下面来以iterator adapters来做例子

// C++ standard规定他们的接口在
#include 
// SGI STL将他们实际定义于
#include 

主要有三类iterator adapters:insert iterators,reverse iterators,iostream iterators

Insert iterators
可以将一般迭代器的赋值(assign)操作转变为插入(insert)操作,这样的迭代器专司尾端插入操作的back_insert_iterator(back_inserter)。专司头端插入操作的front_insert_iterator(front_inserter),可以从任意位置插入的insert_iterator(insert)

Reverse iterators
将一般迭代器的行进方向逆转,使原本应该前进的operator++编程了后退操作,倒转经脉

Iostream iterators
将迭代器绑定到某个iostream上,绑定到istream,成为istream_iterator,拥有输入功能;绑定到ostream,成为ostream_iterator,拥有输出功能,这种迭代器运用于屏幕输出,非常方便。

不废话了,直接拿Reverse iterators测试

先来看看stl_iterator.h

  template<typename _Iterator>
    class reverse_iterator		// reverse_iterator类
    : public iterator<typename iterator_traits<_Iterator>::iterator_category,
		      typename iterator_traits<_Iterator>::value_type,
		      typename iterator_traits<_Iterator>::difference_type,
		      typename iterator_traits<_Iterator>::pointer,
                      typename iterator_traits<_Iterator>::reference>
    {
     
    protected:
      _Iterator current;		// 输入迭代器对象

      typedef iterator_traits<_Iterator>		__traits_type;

    public:
      typedef _Iterator					iterator_type;
      typedef typename __traits_type::difference_type	difference_type;
      typedef typename __traits_type::pointer		pointer;
      typedef typename __traits_type::reference		reference;
	  // 默认构造函数
      _GLIBCXX17_CONSTEXPR
      reverse_iterator() : current() {
      }
	  // 单参数构造函数,参数为iterator_type,即迭代器
      explicit _GLIBCXX17_CONSTEXPR
      reverse_iterator(iterator_type __x) : current(__x) {
      }
	  // 拷贝构造函数
      _GLIBCXX17_CONSTEXPR
      reverse_iterator(const reverse_iterator& __x)
      : current(__x.current) {
      }
// 如果大于c++11,禁止=运算符重载
#if __cplusplus >= 201103L
      reverse_iterator& operator=(const reverse_iterator&) = default;
#endif
	 // 跨其他类型的reverse_iterator可以被复制
      template<typename _Iter>
	_GLIBCXX17_CONSTEXPR
        reverse_iterator(const reverse_iterator<_Iter>& __x)
	: current(__x.base()) {
      }
	  // base()方法,返回本身
      _GLIBCXX17_CONSTEXPR iterator_type
      base() const
      {
      return current; }
      // 运算符重载*
      _GLIBCXX17_CONSTEXPR reference
      operator*() const
      {
     
	_Iterator __tmp = current;
	return *--__tmp;
      }
      // 运算符重载->
      _GLIBCXX17_CONSTEXPR pointer
      operator->() const
      {
     
	_Iterator __tmp = current;
	--__tmp;
	return _S_to_pointer(__tmp);
      }
      // 运算符重载++,后置递增
      _GLIBCXX17_CONSTEXPR reverse_iterator&
      operator++()
      {
     
	--current;
	return *this;
      }
	  // 运算符重载++,前置递增
      _GLIBCXX17_CONSTEXPR reverse_iterator
      operator++(int)
      {
     
	reverse_iterator __tmp = *this;
	--current;
	return __tmp;
      }
	  // 运算符重载--,后置递减
      _GLIBCXX17_CONSTEXPR reverse_iterator&
      operator--()
      {
     
	++current;
	return *this;
      }
	  // 运算符重载--,前置递减
      _GLIBCXX17_CONSTEXPR reverse_iterator
      operator--(int)
      {
     
	reverse_iterator __tmp = *this;
	++current;
	return __tmp;
      }
	  // 运算符重载+
      _GLIBCXX17_CONSTEXPR reverse_iterator
      operator+(difference_type __n) const
      {
      return reverse_iterator(current - __n); }
	  // 运算符重载+=
      _GLIBCXX17_CONSTEXPR reverse_iterator&
      operator+=(difference_type __n)
      {
     
	current -= __n;
	return *this;
      }
	  // 运算符重载-
      _GLIBCXX17_CONSTEXPR reverse_iterator
      operator-(difference_type __n) const
      {
      return reverse_iterator(current + __n); }
	  // 运算符重载-=
      _GLIBCXX17_CONSTEXPR reverse_iterator&
      operator-=(difference_type __n)
      {
     
	current += __n;
	return *this;
      }
	  // 运算符重载[]
      _GLIBCXX17_CONSTEXPR reference
      operator[](difference_type __n) const
      {
      return *(*this + __n); }

    private:
    // 私有静态成员函数,返回一个指针
      template<typename _Tp>
	static _GLIBCXX17_CONSTEXPR _Tp*
	_S_to_pointer(_Tp* __p)
        {
      return __p; }
	// 私有静态成员函数
      template<typename _Tp>
	static _GLIBCXX17_CONSTEXPR pointer
	_S_to_pointer(_Tp __t)
        {
      return __t.operator->(); }
    };

来看看SGI3.3版本的stl_vector.h(其他版本写法也是差不多的)

// 如果这个类支持偏特化,里面的这些元素就自动添加
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  typedef reverse_iterator<const_iterator> const_reverse_iterator;
  typedef reverse_iterator<iterator> reverse_iterator;
// 如果这个类不支持偏特化
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  // 反向迭代器
  typedef reverse_iterator<const_iterator, value_type, const_reference, 
                           difference_type>  const_reverse_iterator;
  typedef reverse_iterator<iterator, value_type, reference, difference_type>
          reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */

...

public:
  reverse_iterator rbegin()
    {
      return reverse_iterator(end()); }
  const_reverse_iterator rbegin() const
    {
      return const_reverse_iterator(end()); }
  reverse_iterator rend()
    {
      return reverse_iterator(begin()); }
  const_reverse_iterator rend() const
    {
      return const_reverse_iterator(begin()); }

我们来测试一下

#include 
#include 
int main() {
     
    std::vector<int> v;
    v.push_back(1);
    v.push_back(9);
    v.push_back(3);
    v.push_back(5);
	// 此处调用reverse_iterator
    std::vector<int>::reverse_iterator it;
    for (it = v.rbegin(); it != v.rend(); it++) {
     
        std::cout << *it << std::endl;
    }
	// 5 3 9 1 逆向输出
    return 0;
}

STL真的是一个很神奇的东西,希望大家努力去学啊!

你可能感兴趣的:(#,STL源码剖析,c++,stl)