📄 stl_iterator.h
字号:
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _Container, class _Iterator>inline insert_iterator<_Container> inserter(_Container& __x, _Iterator __i){ typedef typename _Container::iterator __iter; return insert_iterator<_Container>(__x, __iter(__i));}#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class _BidirectionalIterator, class _Tp, class _Reference = _Tp&, class _Distance = ptrdiff_t> #elsetemplate <class _BidirectionalIterator, class _Tp, class _Reference, class _Distance> #endifclass reverse_bidirectional_iterator { typedef reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, _Reference, _Distance> _Self;protected: _BidirectionalIterator current;public: typedef bidirectional_iterator_tag iterator_category; typedef _Tp value_type; typedef _Distance difference_type; typedef _Tp* pointer; typedef _Reference reference; reverse_bidirectional_iterator() {} explicit reverse_bidirectional_iterator(_BidirectionalIterator __x) : current(__x) {} _BidirectionalIterator base() const { return current; } _Reference operator*() const { _BidirectionalIterator __tmp = current; return *--__tmp; }#ifndef __SGI_STL_NO_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */ _Self& operator++() { --current; return *this; } _Self operator++(int) { _Self __tmp = *this; --current; return __tmp; } _Self& operator--() { ++current; return *this; } _Self operator--(int) { _Self __tmp = *this; ++current; return __tmp; }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _BidirectionalIterator, class _Tp, class _Reference, class _Distance>inline bidirectional_iterator_tagiterator_category(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, _Reference, _Distance>&) { return bidirectional_iterator_tag();}template <class _BidirectionalIterator, class _Tp, class _Reference, class _Distance>inline _Tp*value_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, _Reference, _Distance>&){ return (_Tp*) 0;}template <class _BidirectionalIterator, class _Tp, class _Reference, class _Distance>inline _Distance*distance_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, _Reference, _Distance>&){ return (_Distance*) 0;}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _BiIter, class _Tp, class _Ref, class _Distance>inline bool operator==( const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __x, const reverse_bidirectional_iterator<_BiIter, _Tp, _Ref, _Distance>& __y){ return __x.base() == __y.base();}#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION// This is the new version of reverse_iterator, as defined in the// draft C++ standard. It relies on the iterator_traits template,// which in turn relies on partial specialization. The class// reverse_bidirectional_iterator is no longer part of the draft// standard, but it is retained for backward compatibility.template <class _Iterator>class reverse_iterator {protected: _Iterator current;public: typedef typename iterator_traits<_Iterator>::iterator_category iterator_category; typedef typename iterator_traits<_Iterator>::value_type value_type; typedef typename iterator_traits<_Iterator>::difference_type difference_type; typedef typename iterator_traits<_Iterator>::pointer pointer; typedef typename iterator_traits<_Iterator>::reference reference; typedef _Iterator iterator_type; typedef reverse_iterator<_Iterator> _Self;public: reverse_iterator() {} explicit reverse_iterator(iterator_type __x) : current(__x) {} reverse_iterator(const _Self& __x) : current(__x.current) {}#ifdef __STL_MEMBER_TEMPLATES template <class _Iter> reverse_iterator(const reverse_iterator<_Iter>& __x) : current(__x.base()) {}#endif /* __STL_MEMBER_TEMPLATES */ iterator_type base() const { return current; } reference operator*() const { _Iterator __tmp = current; return *--__tmp; }#ifndef __SGI_STL_NO_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */ _Self& operator++() { --current; return *this; } _Self operator++(int) { _Self __tmp = *this; --current; return __tmp; } _Self& operator--() { ++current; return *this; } _Self operator--(int) { _Self __tmp = *this; ++current; return __tmp; } _Self operator+(difference_type __n) const { return _Self(current - __n); } _Self& operator+=(difference_type __n) { current -= __n; return *this; } _Self operator-(difference_type __n) const { return _Self(current + __n); } _Self& operator-=(difference_type __n) { current += __n; return *this; } reference operator[](difference_type __n) const { return *(*this + __n); } }; template <class _Iterator>inline bool operator==(const reverse_iterator<_Iterator>& __x, const reverse_iterator<_Iterator>& __y) { return __x.base() == __y.base();}template <class _Iterator>inline bool operator<(const reverse_iterator<_Iterator>& __x, const reverse_iterator<_Iterator>& __y) { return __y.base() < __x.base();}template <class _Iterator>inline typename reverse_iterator<_Iterator>::difference_typeoperator-(const reverse_iterator<_Iterator>& __x, const reverse_iterator<_Iterator>& __y) { return __y.base() - __x.base();}template <class _Iterator>inline reverse_iterator<_Iterator> operator+(typename reverse_iterator<_Iterator>::difference_type __n, const reverse_iterator<_Iterator>& __x) { return reverse_iterator<_Iterator>(__x.base() - __n);}#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */// This is the old version of reverse_iterator, as found in the original// HP STL. It does not use partial specialization.#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class _RandomAccessIterator, class _Tp, class _Reference = _Tp&, class _Distance = ptrdiff_t> #elsetemplate <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance> #endifclass reverse_iterator { typedef reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance> _Self;protected: _RandomAccessIterator current;public: typedef random_access_iterator_tag iterator_category; typedef _Tp value_type; typedef _Distance difference_type; typedef _Tp* pointer; typedef _Reference reference; reverse_iterator() {} explicit reverse_iterator(_RandomAccessIterator __x) : current(__x) {} _RandomAccessIterator base() const { return current; } _Reference operator*() const { return *(current - 1); }#ifndef __SGI_STL_NO_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */ _Self& operator++() { --current; return *this; } _Self operator++(int) { _Self __tmp = *this; --current; return __tmp; } _Self& operator--() { ++current; return *this; } _Self operator--(int) { _Self __tmp = *this; ++current; return __tmp; } _Self operator+(_Distance __n) const { return _Self(current - __n); } _Self& operator+=(_Distance __n) { current -= __n; return *this; } _Self operator-(_Distance __n) const { return _Self(current + __n); } _Self& operator-=(_Distance __n) { current += __n; return *this; } _Reference operator[](_Distance __n) const { return *(*this + __n); }};template <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance>inline random_access_iterator_tagiterator_category(const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>&){ return random_access_iterator_tag();}template <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance>inline _Tp* value_type(const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>&){ return (_Tp*) 0;}template <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance>inline _Distance* distance_type(const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>&){ return (_Distance*) 0;}template <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance>inline bool operator==(const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>& __x, const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>& __y){ return __x.base() == __y.base();}template <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance>inline bool operator<(const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>& __x, const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>& __y){ return __y.base() < __x.base();}template <class _RandomAccessIterator, class _Tp, class _Reference, class _Distance>inline _Distance operator-(const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>& __x, const reverse_iterator<_RandomAccessIterator, _Tp, _Reference, _Distance>& __y){ return __y.base() - __x.base();}template <class _RandAccIter, class _Tp, class _Ref, class _Dist>inline reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist> operator+(_Dist __n, const reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist>& __x){ return reverse_iterator<_RandAccIter, _Tp, _Ref, _Dist>(__x.base() - __n);}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */// When we have templatized iostreams, istream_iterator and ostream_iterator// must be rewritten.template <class _Tp, class _Dist = ptrdiff_t> class istream_iterator { friend bool operator== __STL_NULL_TMPL_ARGS (const istream_iterator&, const istream_iterator&);protected: istream* _M_stream; _Tp _M_value; bool _M_end_marker; void _M_read() { _M_end_marker = (*_M_stream) ? true : false; if (_M_end_marker) *_M_stream >> _M_value; _M_end_marker = (*_M_stream) ? true : false; }public: typedef input_iterator_tag iterator_category; typedef _Tp value_type; typedef _Dist difference_type; typedef const _Tp* pointer; typedef const _Tp& reference; istream_iterator() : _M_stream(&cin), _M_end_marker(false) {} istream_iterator(istream& __s) : _M_stream(&__s) { _M_read(); } reference operator*() const { return _M_value; }#ifndef __SGI_STL_NO_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */ istream_iterator<_Tp, _Dist>& operator++() { _M_read(); return *this; } istream_iterator<_Tp, _Dist> operator++(int) { istream_iterator<_Tp, _Dist> __tmp = *this; _M_read(); return __tmp; }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Tp, class _Dist>inline input_iterator_tag iterator_category(const istream_iterator<_Tp, _Dist>&){ return input_iterator_tag();}template <class _Tp, class _Dist>inline _Tp* value_type(const istream_iterator<_Tp, _Dist>&) { return (_Tp*) 0; }template <class _Tp, class _Dist>inline _Dist* distance_type(const istream_iterator<_Tp, _Dist>&) { return (_Dist*)0; }#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _Tp, class _Distance>inline bool operator==(const istream_iterator<_Tp, _Distance>& __x, const istream_iterator<_Tp, _Distance>& __y) { return (__x._M_stream == __y._M_stream && __x._M_end_marker == __y._M_end_marker) || __x._M_end_marker == false && __y._M_end_marker == false;}template <class _Tp>class ostream_iterator {protected: ostream* _M_stream; const char* _M_string;public: typedef output_iterator_tag iterator_category; typedef void value_type; typedef void difference_type; typedef void pointer; typedef void reference; ostream_iterator(ostream& __s) : _M_stream(&__s), _M_string(0) {} ostream_iterator(ostream& __s, const char* __c) : _M_stream(&__s), _M_string(__c) {} ostream_iterator<_Tp>& operator=(const _Tp& __value) { *_M_stream << __value; if (_M_string) *_M_stream << _M_string; return *this; } ostream_iterator<_Tp>& operator*() { return *this; } ostream_iterator<_Tp>& operator++() { return *this; } ostream_iterator<_Tp>& operator++(int) { return *this; } };#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Tp>inline output_iterator_tag iterator_category(const ostream_iterator<_Tp>&) { return output_iterator_tag();}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */__STL_END_NAMESPACE#endif /* __SGI_STL_INTERNAL_ITERATOR_H */// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -