zoukankan      html  css  js  c++  java
  • list C++实现

    模仿STL中list,实现了其大部分功能。list可以高效地利用内存资源,常数时间的插入删除操作。并且,list除了erase外,不怎么存在迭代器失效的现象。

    #include<iostream>
    #include<iterator>
    #include<algorithm>
    using namespace std;
    template<class T>
    struct _List_node{
    	typedef void* void_pointer;
    	void_pointer next;
    	void_pointer prev;
    		T data;
    };
    template<class T,class Ref,class Ptr>
    class _List_iterator{
    public:
    	typedef _List_iterator<T, T&, T*> iterator;
    	typedef _List_iterator<T, const T&, const T*> const_iterator;
    	typedef _List_iterator<T, Ref, Ptr> self;
    	typedef T value_type;
    	typedef Ptr pointer;
    	typedef Ref reference;
    	typedef _List_node<T>* link_type;
    	typedef size_t size_type;
    	typedef ptrdiff_t difference_type;
    	link_type node;
    	_List_iterator(link_type x):node(x){}
    	_List_iterator(){}
    	_List_iterator(const iterator &x):node(x.node){}
    	bool operator== (const iterator& x )const{return node == x.node;}
    	bool operator!= (const iterator& x)const{return node != x.node;}
    	reference operator*()const{return (*node).data;}
    	pointer operator->()const{return &(operator*());}
    	T operator *(){return node->data;}
    	iterator &operator++(int){
    		iterator tmp = *this;
    		++*this;
    		return tmp;
    	}
    	iterator& operator++(){
    		node = (link_type)((*node).next);
    		return *this;
    	}
    	iterator& operator--(){
    		node = (link_type)((*node).prev);
    		return *this;
    	}
    	iterator& operator--(int){
    		iterator tmp = *this;
    		--*this;
    		return tmp;
    	}
    };
    template<class T>
    class List{
    public:
    	typedef _List_node<T>* link_type;
    	typedef _List_iterator<T,T&,T*> iterator;
    	typedef T value_type;
    	typedef T* pointer;
    	typedef T& reference;
    	typedef size_t size_type;
    	typedef ptrdiff_t difference_type;
    protected:
    	typedef _List_node<T> list_node;
    	link_type node;
    	//.....
    public:
    	List(){create_node();}
    	List(List& alist){
    		create_node();
    		for(List<T>::iterator ite=alist.begin();ite!=alist.end();++ite)
    			push_back(*ite);
    	}
    	iterator begin(){return (link_type)((*node).next);}
    	iterator end(){return node;}
    	bool empty()const{return node->next == node;}
    	size_type size()const{
    		size_type result = 0;
    		distance(begin(),end(),result);
    		return result;
    	}
    	reference front(){return *begin();}
    	reference back(){return *(--end());}
    	iterator insert(iterator position,const T& x){
    		link_type tmp = create_node(x);
    		tmp->next = position.node;
    		tmp->prev = position.node->prev;
    		(link_type(position.node->prev))->next = tmp;
    		position.node->prev = tmp;
    		return tmp;
    	}
    	link_type create_node(const T& x){
    		link_type p = new list_node;
    		p->data = x;
    		p->prev = NULL;
    		p->next = NULL;
    		return p ;
    	}
    	void create_node(){
    		node = new list_node();
    		node->next = node;
    		node->prev = node;
    	}
    	inline difference_type distance(iterator first,iterator last,difference_type &n){
    		n = 0;
    		while(first != last){++first;++n;}
    		return n;
    	}
    	void push_front(const T& x){insert(begin(),x);}
    	void push_back(const T& x){insert(end(),x);}
    	void pop_front(){erase(begin());}
    	void pop_back(){iterator tmp = end();erase(--tmp);}
    	iterator erase(iterator position){
    		link_type next_node = link_type(position.node->next);
    		link_type prev_node = link_type(position.node->prev);
    		prev_node->next = next_node;
    		next_node->prev = prev_node;
    		destory_node(position.node);
    		return iterator(next_node);
    	}
    	iterator erase(iterator first,iterator last){
    		while(first!=last){
    			first = erase(first);
    		}
    		return last;
    	}
    	void destory_node(link_type p){delete p;}
    	~List(){
    		clear();
    		delete node;
    	}
    	void clear()
        {
            while (!empty())
                pop_back();
        }
    	iterator find(const T& value){
    		iterator first = begin();
    		while(first!= end()){
    			if(*first == value)return first;
    			++first;
    		}
    		return first;
    	}
    	void remove(const T& value){
    		iterator first = begin();
    		iterator last = end();
    		while(first != last){
    			if(*first == value)first = erase(first);
    			else ++first;
    		}
    	}
    	void transfer(iterator position,iterator first,iterator last){
    		if(position != last){
    			(*(link_type((*last.node).prev))).next = position.node;
    			(*(link_type((*first.node).prev))).next = last.node;
    			(*(link_type((*position.node).prev))).next = first.node;
    			link_type tmp = link_type((*position.node).prev);
    			(*position.node).prev = (*last.node).prev;
    			(*last.node).prev = (*first.node).prev;
    			(*first.node).prev = tmp;
    		}
    	}
    	void splice(iterator position,List<T> &x){
    		if(!x.empty())
    			transfer(position,x.begin(),x.end());
    	}
    	void splice(iterator position,List<T> &,iterator i){
    		iterator j = i;
    		++j;
    		if(position == i||position == j)return;
    		transfer(position,i,j);
    	}
    	void splice(iterator position,List<T>&,iterator first,iterator last){
    		if(first!=last)
    			transfer(position,first,last);
    	}
    };
    void test1(){ //数据类型存储測试
    	List<int> listInt;
    	listInt.push_back(1);
    	listInt.push_back(2);
    	listInt.push_back(3);
    	for(List<int>::iterator ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	List<double> listDouble;
    	listDouble.push_back(0.1);
    	listDouble.push_back(0.2);
    	listDouble.push_back(0.3);
    	for(List<double>::iterator ite = listDouble.begin();ite != listDouble.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	class A{
    		int data;
    	public:
    		A(int a=0):data(a){}
    		operator int(){return data;}
    	};
    	List<A> listA;
    	A a(1),b(2),c(3);
    	listA.push_back(a);
    	listA.push_back(b);
    	listA.push_back(c);
    	for(List<A>::iterator ite = listA.begin();ite != listA.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    }
    
    void test2(){// 功能測试
    	List<int> listInt;
    	List<int>::iterator ite;
    	listInt.push_back(1);
    	listInt.push_back(2);
    	listInt.push_back(3);
    	listInt.push_back(4);
    	listInt.push_back(5);
    	listInt.push_back(6);
    	listInt.push_back(7);
    	listInt.push_back(8);
    	listInt.push_back(9);
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	List<int> listInt2(listInt);
    	for(ite = listInt2.begin();ite != listInt2.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	listInt.push_front(0);
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	listInt.pop_back();
    	listInt.pop_front();
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	ite = listInt.find(6);
    	if(ite != listInt.end())listInt.erase(ite);
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	ite = listInt.find(5);
    	if(ite != listInt.end())listInt.erase(ite,listInt.end());
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	listInt.pop_front();
    	listInt.pop_back();
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	listInt.remove(2);
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	listInt.clear();
    	for(ite = listInt.begin();ite != listInt.end();++ite)
    		cout<<*ite<<" clear()";
    	cout<<endl;
    }
    void test3(){//拼接功能測试
    	List<int> listInt1;
    	List<int>::iterator ite;
    	listInt1.push_back(1);
    	listInt1.push_back(2);
    	listInt1.push_back(3);
    	listInt1.push_back(4);
    	listInt1.push_back(5);
    	List<int> listInt2(listInt1);
    	cout<<"listInt1: ";
    	for(ite = listInt1.begin();ite != listInt1.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	cout<<"listInt2: ";
    	for(ite = listInt2.begin();ite != listInt2.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	ite = listInt1.find(4);
    	List<int>::iterator first = listInt2.find(2);
    	List<int>::iterator last = listInt2.find(4);
    	listInt1.transfer(ite,first,last);
    	for(ite = listInt1.begin();ite != listInt1.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	for(ite = listInt2.begin();ite != listInt2.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    	ite = listInt1.find(2);
    	listInt1.splice(ite,listInt2);
    	for(ite = listInt1.begin();ite != listInt1.end();++ite)
    		cout<<*ite<<" ";
    	cout<<endl;
    }
    int main(){
    	cout<<"--------data type test----------"<<endl;
    	test1();
    	cout<<"--------function  test----------"<<endl;
    	test2();
    	cout<<"---------splice  test-----------"<<endl;
    	test3();
    }


  • 相关阅读:
    贪心例题
    第十六周总结
    软件工程个人课程总结
    冲刺二十一天
    浅谈async/await
    浅谈设计模式的六大原则
    dotnetcore配置框架简介
    这一次,终于弄懂了协变和逆变
    科个普:进程、线程、并发、并行
    五分钟了解Semaphore
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3793367.html
Copyright © 2011-2022 走看看