⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_iterator.h

📁 著名的SGI的STL lib源码.(C++范型类编成,没有合适的分类,但是放到数据结构类别中也绝对适合)
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class BidirectionalIterator, class T, class Reference = T&,           class Distance = ptrdiff_t> #elsetemplate <class BidirectionalIterator, class T, class Reference,           class Distance> #endifclass reverse_bidirectional_iterator {  typedef reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,                                         Distance> self;protected:  BidirectionalIterator current;public:  typedef bidirectional_iterator_tag iterator_category;  typedef T                          value_type;  typedef Distance                   difference_type;  typedef T*                         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 T, class Reference,           class Distance>inline bidirectional_iterator_tagiterator_category(const reverse_bidirectional_iterator<BidirectionalIterator,                                                       T,                                                       Reference, Distance>&) {  return bidirectional_iterator_tag();}template <class BidirectionalIterator, class T, class Reference,           class Distance>inline T*value_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,                                               Reference, Distance>&) {  return (T*) 0;}template <class BidirectionalIterator, class T, class Reference,           class Distance>inline Distance*distance_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,                                                  Reference, Distance>&) {  return (Distance*) 0;}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class BidirectionalIterator, class T, class Reference,          class Distance>inline bool operator==(    const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,                                         Distance>& x,     const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,                                         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.current) {}#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+(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 T, class Reference = T&,          class Distance = ptrdiff_t> #elsetemplate <class RandomAccessIterator, class T, class Reference,          class Distance> #endifclass reverse_iterator {  typedef reverse_iterator<RandomAccessIterator, T, Reference, Distance>        self;protected:  RandomAccessIterator current;public:  typedef random_access_iterator_tag iterator_category;  typedef T                          value_type;  typedef Distance                   difference_type;  typedef T*                         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 T, class Reference, class Distance>inline random_access_iterator_tagiterator_category(const reverse_iterator<RandomAccessIterator, T,                                         Reference, Distance>&) {  return random_access_iterator_tag();}template <class RandomAccessIterator, class T, class Reference, class Distance>inline T* value_type(const reverse_iterator<RandomAccessIterator, T,                                            Reference, Distance>&) {  return (T*) 0;}template <class RandomAccessIterator, class T, class Reference, class Distance>inline Distance* distance_type(const reverse_iterator<RandomAccessIterator, T,                                                      Reference, Distance>&) {  return (Distance*) 0;}template <class RandomAccessIterator, class T, class Reference, class Distance>inline bool operator==(const reverse_iterator<RandomAccessIterator, T,                                              Reference, Distance>& x,                        const reverse_iterator<RandomAccessIterator, T,                                              Reference, Distance>& y) {  return x.base() == y.base();}template <class RandomAccessIterator, class T, class Reference, class Distance>inline bool operator<(const reverse_iterator<RandomAccessIterator, T,                                             Reference, Distance>& x,                       const reverse_iterator<RandomAccessIterator, T,                                             Reference, Distance>& y) {  return y.base() < x.base();}template <class RandomAccessIterator, class T, class Reference, class Distance>inline Distance operator-(const reverse_iterator<RandomAccessIterator, T,                                                 Reference, Distance>& x,                           const reverse_iterator<RandomAccessIterator, T,                                                 Reference, Distance>& y) {  return y.base() - x.base();}template <class RandomAccessIter, class T, class Ref, class Dist>inline reverse_iterator<RandomAccessIter, T, Ref, Dist> operator+(Dist n, const reverse_iterator<RandomAccessIter, T, Ref, Dist>& x) {  return reverse_iterator<RandomAccessIter, T, Ref, Dist>(x.base() - n);}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class T, class Distance = ptrdiff_t> class istream_iterator {  friend bool  operator== __STL_NULL_TMPL_ARGS (const istream_iterator<T, Distance>& x,                                   const istream_iterator<T, Distance>& y);protected:  istream* stream;  T value;  bool end_marker;  void read() {    end_marker = (*stream) ? true : false;    if (end_marker) *stream >> value;    end_marker = (*stream) ? true : false;  }public:  typedef input_iterator_tag iterator_category;  typedef T                  value_type;  typedef Distance           difference_type;  typedef const T*           pointer;  typedef const T&           reference;  istream_iterator() : stream(&cin), end_marker(false) {}  istream_iterator(istream& s) : stream(&s) { read(); }  reference operator*() const { return value; }#ifndef __SGI_STL_NO_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */  istream_iterator<T, Distance>& operator++() {     read();     return *this;  }  istream_iterator<T, Distance> operator++(int)  {    istream_iterator<T, Distance> tmp = *this;    read();    return tmp;  }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class T, class Distance>inline input_iterator_tag iterator_category(const istream_iterator<T, Distance>&) {  return input_iterator_tag();}template <class T, class Distance>inline T* value_type(const istream_iterator<T, Distance>&) { return (T*) 0; }template <class T, class Distance>inline Distance* distance_type(const istream_iterator<T, Distance>&) {  return (Distance*) 0;}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class T, class Distance>inline bool operator==(const istream_iterator<T, Distance>& x,                       const istream_iterator<T, Distance>& y) {  return x.stream == y.stream && x.end_marker == y.end_marker ||         x.end_marker == false && y.end_marker == false;}template <class T>class ostream_iterator {protected:  ostream* stream;  const char* 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) : stream(&s), string(0) {}  ostream_iterator(ostream& s, const char* c) : stream(&s), string(c)  {}  ostream_iterator<T>& operator=(const T& value) {     *stream << value;    if (string) *stream << string;    return *this;  }  ostream_iterator<T>& operator*() { return *this; }  ostream_iterator<T>& operator++() { return *this; }   ostream_iterator<T>& operator++(int) { return *this; } };#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class T>inline output_iterator_tag iterator_category(const ostream_iterator<T>&) {  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 + -