zoukankan      html  css  js  c++  java
  • 自己造容器List

    //自己造容器--List
    /*
    1、iterator
    2、头迭代器
    3、尾迭代器
    4、链表长
    5、判空
    6、清除
    7、取头元素
    8、取尾元素
    9、头插入
    10、尾插入
    11、头删除
    12、尾删除
    13、插入函数
    14、删除函数
    */
    
    template<typename Object>
    class List
    {
    private:
    	//结点
    	struct Node
    	{
    		Object data;
    		Node *prev;                       //前置指针
    		Node *next;                     //后置指针
    
    		Node(const Object & d = Object(), Node*p = NULL, Node*n = NULL) : data(d), prev(p), next(n){}
    	};
    
    public:
    	//迭代器
    	class const_iterator
    	{
    	public:
    		const_iterator() :current(NULL){}
    
    		//*重载
    		const Object & operator*()const
    		{
    			return retrieve();
    		}
    
    		//pre++重载
    		const_iterator & operator++()        //前置++,返回引用
    		{
    			current = current->next;
    			return *this;        //this是一个指向iterator的指针
    		}
    
    		//pre--
    		const_iterator & operator--()        //前置--,返回引用
    		{
    			current = current->prev;
    			return *this;        //this是一个指向iterator的指针
    		}
    
    		//pos++重载
    		const_iterator operator++(int)       //后置++,返回参数
    		{
    			const_iterator old = *this;
    			++(*this);
    			return old;
    		}
    
    		//pos--
    		const_iterator operator--(int)       //后置--,返回参数
    		{
    			const_iterator old = *this;
    			--(*this);
    			return old;
    		}
    
    		//==重载
    		bool operator==(const const_iterator & rhs)const
    		{
    			return current == rhs.current;
    		}
    
    		//!=重载
    		bool operator!=(const const_iterator & rhs)const
    		{
    			return !(current == rhs.current);
    		}
    
    	protected: //在一般迭代器中变为private
    		Node*current;
    
    		Object &retrieve()const
    		{
    			return current->data;
    		}
    
    		const_iterator(Node*p) :current(p){}
    
    		friend class List<Object>;
    	};
    
    	//一般迭代器继承常迭代器
    	class iterator : public const_iterator
    	{
    	public:
    		iterator(){}
    
    		Object &operator*()
    		{
    			return retrieve();
    		}
    
    		//以免被上一个operator*覆盖
    		const Object& operator*()const
    		{
    			return const_iterator::operator*();
    		}
    
    		//pre++
    		iterator operator++()
    		{
    			current = current->next;
    			return *this;
    		}
    
    		//pre--
    		iterator operator--()
    		{
    			current = current->prev;
    			return *this;
    		}
    
    		//pos++
    		iterator operator++(int)
    		{
    			iterator old = *this;
    			++(*this);
    			return old;
    		}
    
    		//pos--
    		iterator operator--(int)
    		{
    			iterator old = *this;
    			--(*this);
    			return old;
    		}
    	protected:
    		iterator(Node*p) : const_iterator(p){}
    
    		friend class List<Object>;
    	};
    
    public:
    	//the big three
    	List()
    	{
    		init();
    	}
    
    	~List()
    	{
    		clear();
    		delete head;
    		delete tail;
    	}
    
    	List(const List &rhs)
    	{
    		init();
    		*this = rhs;
    	}
    
    	const List& operator=(const List & rhs)
    	{
    		if (this == &rhs)
    			return *this;
    		clear();
    		for (const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr)
    			push_back(*itr);
    		return *this;
    	}
    
    	//头迭代器
    	iterator begin()
    	{
    		return iterator(head->next);
    	}
    
    	const_iterator begin()const
    	{
    		return const_iterator(head->next);
    	}
    
    	//尾迭代器
    	iterator end()
    	{
    		return iterator(tail);
    	}
    
    	const_iterator end()const
    	{
    		return const_iterator(tail);
    	}
    
    	//链长
    	int size()const
    	{
    		return theSize;
    	}
    
    	//判空
    	bool empty()const
    	{
    		return size() == 0;
    	}
    
    	//清除
    	void clear()
    	{
    		while (!empty())
    		{
    			pop_front();
    		}
    	}
    
    	//取头元素
    	Object & front()
    	{
    		return *begin();
    	}
    
    	const Object & front()const
    	{
    		return *begin();
    	}
    
    	//取尾元素
    	Object & back()
    	{
    		return *--end();
    	}
    
    	const Object & back()const
    	{
    		return *--end();
    	}
    
    	//前插
    	void push_front(const Object&x)
    	{
    		insert(begin(), x);
    	}
    
    	//后插
    	void push_back(const Object&x)
    	{
    		insert(end(), x);
    	}
    
    	//前删
    	void pop_front()
    	{
    		erase(begin());
    	}
    
    	//后删     
    	void pop_back()
    	{
    		erase(--end());
    	}
    
    	//插入
    	iterator insert(iterator itr, const Object &x)
    	{
    		theSize++;
    		Node *p=itr.current;
    		/*Node*q=new Node(x, p->prev, p);
    		p->prev->next=q;
    		p->prev=q;
    		return iterator(q);
    		*/
    		return iterator(p->prev = p->prev->next = new Node(x, p->prev, p));
    	}
    
    	//单个删除
    	iterator erase(iterator itr)
    	{
    		Node*p = itr.current;
    		iterator retVal(p->next);
    		p->prev->next = p->next;
    		p->next->prev = p->prev;
    		delete p;
    		theSize--;
    
    		return retVal;
    	}
    
    	//多个删除
    	iterator erase(iterator start, iterator end)
    	{
    		iterator itr;
    		for (itr = start; itr != end;)
    			itr = erase(itr);
    		return itr;
    	}
    
    private:
    	int theSize;
    	Node *head;
    	Node *tail;
    
    	void init()
    	{
    		theSize = 0;
    		head = new Node;
    		tail = new Node;
    		head->next = tail;
    		tail->prev = head;
    	}
    };
    

      

  • 相关阅读:
    移动视频开发让我们把会议室装进口袋里
    音视频 开发技术,让智能家居更智能!
    视频对讲SDK 大厅好友解决方案
    视频开发的安全保障措施
    手机视频开发即时通讯软件
    借音视频开发技术,开发招聘新途径
    移动视频技术的先驱
    tf.variable_scope
    sklearn 数据预处理
    Tensorflow自编码器及多层感知机
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5949263.html
Copyright © 2011-2022 走看看