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

📄 list

📁 mpeg4 video codec mpeg4 video codec
💻
📖 第 1 页 / 共 2 页
字号:
/*	Copyright (C) 2004 Garrett A. Kajmowicz	This file is part of the uClibc++ Library.	This library is free software; you can redistribute it and/or	modify it under the terms of the GNU Lesser General Public	License as published by the Free Software Foundation; either	version 2.1 of the License, or (at your option) any later version.	This library is distributed in the hope that it will be useful,	but WITHOUT ANY WARRANTY; without even the implied warranty of	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU	Lesser General Public License for more details.	You should have received a copy of the GNU Lesser General Public	License along with this library; if not, write to the Free Software	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#include "memory"#include "iterator"#include "algorithm"#ifndef __STD_HEADER_LIST#define __STD_HEADER_LIST 1namespace std{	template <class T, class Allocator = allocator<T> > class _UCXXEXPORT list {	public:		typedef typename Allocator::reference		reference;		typedef typename Allocator::const_reference	const_reference;		typedef typename Allocator::size_type		size_type;		typedef typename Allocator::difference_type	difference_type;		typedef T					value_type;		typedef Allocator				allocator_type;		typedef typename Allocator::pointer		pointer;		typedef typename Allocator::const_pointer	const_pointer;	protected:		class node;		class iter_list;		node * list_start;		node * list_end;		size_type elements;		Allocator a;	public:		typedef iter_list				iterator;		typedef iter_list				const_iterator;		typedef std::reverse_iterator<iterator>		reverse_iterator;		typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;		explicit list(const Allocator& = Allocator());		explicit list(size_type n, const T& value = T(), const Allocator& = Allocator());		template <class InputIterator> list(InputIterator first, InputIterator last, 			const Allocator& al= Allocator());		list(const list<T,Allocator>& x);		~list();		list<T,Allocator>& operator=(const list<T,Allocator>& x){			if(&x == this){				return *this;			}			clear();			iterator i = x.begin();			while(i != x.end()){				push_back(*i);				++i;			}			return *this;		}		template <class InputIterator> void assign(InputIterator first, InputIterator last);		template <class Size, class U> void assign(Size n, const U& u = U());		allocator_type get_allocator() const;		iterator		begin();		const_iterator		begin() const;		iterator		end();		const_iterator		end() const;		reverse_iterator	rbegin();		const_reverse_iterator	rbegin() const;		reverse_iterator	rend();		const_reverse_iterator	rend() const;		bool      empty() const;		size_type size() const;		size_type max_size() const;		void      resize(size_type sz, T c = T());		reference       front();		const_reference front() const;		reference       back();		const_reference back() const;		void push_front(const T& x);		void pop_front();		void push_back(const T& x);		void pop_back();		iterator insert(iterator position, const T& x = T());		void     insert(iterator position, size_type n, const T& x);		template <class InputIterator> void insert(iterator position, InputIterator first, InputIterator last);		iterator erase(iterator position);		iterator erase(iterator position, iterator last);		void     swap(list<T,Allocator>&);		void     clear();		void splice(iterator position, list<T,Allocator>& x);		void splice(iterator position, list<T,Allocator>& x, iterator i);		void splice(iterator position, list<T,Allocator>& x, iterator first, iterator last);		void remove(const T& value);		template <class Predicate> void remove_if(Predicate pred);		void unique();		template <class BinaryPredicate> void unique(BinaryPredicate binary_pred);		void merge(list<T,Allocator>& x);		template <class Compare> void merge(list<T,Allocator>& x, Compare comp);		void sort();		template <class Compare> void sort(Compare comp);		void reverse();	protected:		void swap_nodes(node * x, node * y);	};	//Implementations of List	//List node	template <class T, class Allocator> class _UCXXEXPORT list<T, Allocator>::node{	public:		node * previous;		node * next;		T * val;		node(): previous(0), next(0), val(0){ }		node(const T & t ): previous(0), next(0), val(0) {			val = new T(t);			//FIXME use allocator somehow but only call constructor once		}		node(const T & t, node * p, node * n): previous(p), next(n), val(0) {			val = new T(t);		}		~node(){ }	};	//List iterator	template <class T, class Allocator> class _UCXXEXPORT list<T, Allocator>::iter_list		: public std::iterator<			bidirectional_iterator_tag, 			T, 			typename Allocator::difference_type, 			typename Allocator::pointer, 			typename Allocator::reference		>	{	private:		node * current;	public:		iter_list():current(0) { }		iter_list( typename list<T, Allocator>::node * n): current(n) { }		iter_list(const typename list<T, Allocator>::iter_list & l): current(l.current) { }		~iter_list(){ }		iter_list & operator=(const typename list<T, Allocator>::iter_list & right ){			current = right.current;			return *this;		}		T & operator*(){			return *(current->val);		}		T * operator->(){			return current->val;		}		const T & operator*() const{			return *current->val;		}		const T * operator->() const{			return current->val;		}		bool operator==(const typename list<T, Allocator>::iter_list & right){			return (current == right.current);		}		bool operator!=(const typename list<T, Allocator>::iter_list & right){			return (current != right.current);		}		iter_list & operator++(){			current = current->next;			return *this;		}		iter_list operator++(int){			iter_list temp(current);			current = current->next;			return temp;		}				iter_list & operator--(){			current = current->previous;			return *this;		}		iter_list operator--(int){			iter_list temp(current);			current = current->previous;			return temp;		}		node * link_struct(){			return current;		}		iter_list & operator+=(unsigned int n){			for(unsigned int i = 0; i < n; ++i){				current = current->next;			}			return *this;		}		iter_list & operator-=(unsigned int n){			for(unsigned int i = 0; i < n; ++i){				current = current->previous;			}			return *this;		}	};	template<class T, class Allocator> list<T, Allocator>::list(const Allocator& al)		:list_start(0), list_end(0), elements(0), a(al)	{		//End node		list_start = new node();		list_end = list_start;		return;	}	template<class T, class Allocator> list<T, Allocator>::list		(typename Allocator::size_type n, const T& value, const Allocator& al)		:list_start(0), list_end(0), elements(0), a(al)	{		//End node		list_start = new node();		list_end = list_start;		for(typename Allocator::size_type i = 0; i < n ; ++i){			push_back(value);		}	}	template<class T, class Allocator> template <class InputIterator>		list<T, Allocator>::list		(InputIterator first, InputIterator last, const Allocator& al)		: list_start(0), list_end(0), elements(0), a(al)	{		list_start = new node();		list_end = list_start;		while(first != last){			push_back(*first);			++first;		}	}	template<class T, class Allocator> list<T, Allocator>::list(const list<T,Allocator>& x)		: list_start(0), list_end(0), elements(0), a(x.a)	{		list_start = new node();		list_end = list_start;		iterator i = x.begin();		while(i != x.end()){			push_back( *i);			++i;		}	}	template<class T, class Allocator> list<T, Allocator>::~list(){		while(elements > 0){			pop_front();		}		delete list_start->val;		delete list_start;		list_start = 0;		list_end = 0;	}	template<class T, class Allocator> void list<T, Allocator>::swap_nodes(node * x, node * y){		if(x == y){			return;		}		T * v = x->val;		x->val = y->val;		y->val = v;	}	template<class T, class Allocator> typename list<T, Allocator>::iterator 		list<T, Allocator>::begin()	{		return iterator(list_start);	}		template<class T, class Allocator> typename list<T, Allocator>::const_iterator		list<T, Allocator>::begin() const	{		return const_iterator(list_start);	}		template<class T, class Allocator> typename list<T, Allocator>::iterator		list<T, Allocator>::end()	{		return iterator(list_end);	}	template<class T, class Allocator> typename list<T, Allocator>::const_iterator		list<T, Allocator>::end() const	{		return const_iterator(list_end);	}	template<class T, class Allocator> typename list<T, Allocator>::reverse_iterator		list<T, Allocator>::rbegin()	{		return reverse_iterator(end());	}	template<class T, class Allocator> typename list<T, Allocator>::const_reverse_iterator		list<T, Allocator>::rbegin() const	{		return const_reverse_iterator(end());	}	template<class T, class Allocator> typename list<T, Allocator>::reverse_iterator		list<T, Allocator>::rend()	{		return reverse_iterator(begin());	}	template<class T, class Allocator> typename list<T, Allocator>::const_reverse_iterator		list<T, Allocator>::rend() const	{		return const_reverse_iterator(begin());	}	template<class T, class Allocator> bool list<T, Allocator>::empty() const{		return (elements == 0);	}	template<class T, class Allocator> typename list<T, Allocator>::size_type list<T, Allocator>::size() const{		return elements;	}	template<class T, class Allocator> typename list<T, Allocator>::size_type list<T, Allocator>::max_size() const{		return ((size_type)(-1)) / (sizeof(T) + sizeof(node));	}	template<class T, class Allocator> void list<T, Allocator>::resize(typename Allocator::size_type sz, T c){		if(sz > elements){			for(typename Allocator::size_type i = elements; i < sz; ++i){				push_back(c);			}		}		if(sz < elements){			for(typename Allocator::size_type i = elements; i > sz; --i){				pop_back();			}		}	}	template<class T, class Allocator> typename list<T, Allocator>::reference list<T, Allocator>::front(){		return *(list_start->val);	}	template<class T, class Allocator> typename list<T, Allocator>::const_reference list<T, Allocator>::front() const{		return *(list_start->val);	}	template<class T, class Allocator> typename list<T, Allocator>::reference list<T, Allocator>::back(){		return *(list_end->previous->val);	}	template<class T, class Allocator> typename list<T, Allocator>::const_reference list<T, Allocator>::back() const{		return *(list_end->previous->val);	}	template<class T, class Allocator> void list<T, Allocator>::push_front(const T& x){		node * temp = new node(x);		list_start->previous = temp;		temp->previous = 0;		temp->next = list_start;		list_start = temp;		++elements;	}	template<class T, class Allocator> void list<T, Allocator>::pop_front(){		if(elements > 0){			list_start = list_start->next;			delete list_start->previous->val;			delete list_start->previous;			list_start->previous = 0;			--elements;		}	}	template<class T, class Allocator> void list<T, Allocator>::push_back(const T& x){		if(elements == 0){			//The list is completely empty			list_start = new node(x);			list_end->previous = list_start;			list_start->previous = 0;			list_start->next = list_end;			elements = 1;		}else{			node * temp = new node(x);			temp->previous = list_end->previous;			temp->next = list_end;			list_end->previous->next = temp;			list_end->previous = temp;			++elements;		}	}	template<class T, class Allocator> void list<T, Allocator>::pop_back(){		if(elements > 0){			node * temp = list_end->previous;			if(temp == list_start){				list_end->previous = 0;				list_start = list_end;			}else{				temp->previous->next = temp->next;				list_end->previous = temp->previous;			}			delete temp->val;			delete temp;			--elements;		}	}	template<class T, class Allocator> typename list<T, Allocator>::iterator 		list<T, Allocator>::insert(iterator position, const T& x)	{		node * temp = new node(x);		temp->previous = position.link_struct()->previous;		temp->next = position.link_struct();		if(temp->previous == 0){			list_start = temp;		}else{			position.link_struct()->previous->next = temp;

⌨️ 快捷键说明

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