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

📄 iterator.h

📁 C++标准库源代码_C++ STL Source Code 请不要修改任何文件
💻 H
字号:
/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty. * */#ifndef ITERATOR_H#define ITERATOR_H#include <stddef.h>#include <iostream.h>#include <bool.h>#include <function.h>struct input_iterator_tag {};struct output_iterator_tag {};struct forward_iterator_tag {};struct bidirectional_iterator_tag {};struct random_access_iterator_tag {};template <class T, class Distance> struct input_iterator {};struct output_iterator {};template <class T, class Distance> struct forward_iterator {};template <class T, class Distance> struct bidirectional_iterator {};template <class T, class Distance> struct random_access_iterator {};template <class T, class Distance> inline input_iterator_tag iterator_category(const input_iterator<T, Distance>&) {    return input_iterator_tag();}inline output_iterator_tag iterator_category(const output_iterator&) {    return output_iterator_tag();}template <class T, class Distance> inline forward_iterator_tagiterator_category(const forward_iterator<T, Distance>&) {    return forward_iterator_tag();}template <class T, class Distance> inline bidirectional_iterator_tagiterator_category(const bidirectional_iterator<T, Distance>&) {    return bidirectional_iterator_tag();}template <class T, class Distance> inline random_access_iterator_tagiterator_category(const random_access_iterator<T, Distance>&) {    return random_access_iterator_tag();}template <class T>inline random_access_iterator_tag iterator_category(const T*) {    return random_access_iterator_tag();}template <class T, class Distance> inline T* value_type(const input_iterator<T, Distance>&) {    return (T*)(0); }template <class T, class Distance> inline T* value_type(const forward_iterator<T, Distance>&) {    return (T*)(0);}template <class T, class Distance> inline T* value_type(const bidirectional_iterator<T, Distance>&) {    return (T*)(0);}template <class T, class Distance> inline T* value_type(const random_access_iterator<T, Distance>&) {    return (T*)(0);}template <class T>inline T* value_type(const T*) { return (T*)(0); }template <class T, class Distance> inline Distance* distance_type(const input_iterator<T, Distance>&) {    return (Distance*)(0);}template <class T, class Distance> inline Distance* distance_type(const forward_iterator<T, Distance>&) {    return (Distance*)(0);}template <class T, class Distance> inline Distance* distance_type(const bidirectional_iterator<T, Distance>&) {    return (Distance*)(0);}template <class T, class Distance> inline Distance* distance_type(const random_access_iterator<T, Distance>&) {    return (Distance*)(0);}template <class T>inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*)(0); }template <class Container>class back_insert_iterator : public output_iterator {protected:    Container& container;public:    back_insert_iterator(Container& x) : container(x) {}    back_insert_iterator<Container>&    operator=(const Container::value_type& value) { 	container.push_back(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; }};template <class Container>back_insert_iterator<Container> back_inserter(Container& x) {    return back_insert_iterator<Container>(x);}template <class Container>class front_insert_iterator : public output_iterator {protected:    Container& container;public:    front_insert_iterator(Container& x) : container(x) {}    front_insert_iterator<Container>&    operator=(const Container::value_type& value) { 	container.push_front(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; }};template <class Container>front_insert_iterator<Container> front_inserter(Container& x) {    return front_insert_iterator<Container>(x);}template <class Container>class insert_iterator : public output_iterator {protected:    Container& container;    Container::iterator iter;public:    insert_iterator(Container& x, Container::iterator i) 	: container(x), iter(i) {}    insert_iterator<Container>&    operator=(const Container::value_type& value) { 	iter = container.insert(iter, 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 i) {    return insert_iterator<Container>(x, Container::iterator(i));}template <class BidirectionalIterator, class T, class Reference,           class Distance> // Reference = T& // Distance = ptrdiff_tclass reverse_bidirectional_iterator     : public bidirectional_iterator<T, Distance> {    typedef reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,                                           Distance> self;    friend bool operator==(const self& x, const self& y);protected:    BidirectionalIterator current;public:    reverse_bidirectional_iterator() {}    reverse_bidirectional_iterator(BidirectionalIterator x) : current(x) {}    BidirectionalIterator base() { return current; }    Reference operator*() const {	BidirectionalIterator tmp = current;	return *--tmp;    }    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;    }};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.current == y.current;}template <class RandomAccessIterator, class T, class Reference,          class Distance> // Reference = T&// Distance = ptrdiff_tclass reverse_iterator : public random_access_iterator<T, Distance> {    typedef reverse_iterator<RandomAccessIterator, T, Reference, Distance>	self;    friend bool operator==(const self& x, const self& y);    friend bool operator<(const self& x, const self& y);    friend Distance operator-(const self& x, const self& y);    friend self operator+(Distance n, const self& x);protected:    RandomAccessIterator current;public:    reverse_iterator() {}    reverse_iterator(RandomAccessIterator x) : current(x) {}    RandomAccessIterator base() { return current; }    Reference operator*() const { return *(current - 1); }    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) { return *(*this + n); }};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.current == y.current;}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.current < x.current;}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.current - x.current;}template <class RandomAccessIterator, class T, class Reference, class Distance>inline reverse_iterator<RandomAccessIterator, T, Reference, Distance> operator+(Distance n,	  const reverse_iterator<RandomAccessIterator, T, Reference,	                         Distance>& x) {    return reverse_iterator<RandomAccessIterator, T, Reference, Distance>	(x.current - n);}template <class OutputIterator, class T>class raw_storage_iterator : public output_iterator {protected:    OutputIterator iter;public:    raw_storage_iterator(OutputIterator x) : iter(x) {}    raw_storage_iterator<OutputIterator, T>& operator*() { return *this; }    raw_storage_iterator<OutputIterator, T>& operator=(const T& element) {	construct(iter, element);	return *this;    }            raw_storage_iterator<OutputIterator, T>& operator++() {	++iter;	return *this;    }    raw_storage_iterator<OutputIterator, T> operator++(int) {	raw_storage_iterator<OutputIterator, T> tmp = *this;	++iter;	return tmp;    }};template <class T, class Distance> // Distance == ptrdiff_tclass istream_iterator : public input_iterator<T, Distance> {friend bool operator==(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:    istream_iterator() : stream(&cin), end_marker(false) {}    istream_iterator(istream& s) : stream(&s) { read(); }    const T& operator*() const { return value; }    istream_iterator<T, Distance>& operator++() { 	read(); 	return *this;    }    istream_iterator<T, Distance> operator++(int)  {	istream_iterator<T, Distance> tmp = *this;	read();	return tmp;    }};template <class T, class Distance>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 : public output_iterator {protected:    ostream* stream;    char* string;public:    ostream_iterator(ostream& s) : stream(&s), string(0) {}    ostream_iterator(ostream& s, 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; } };#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -