码迷,mamicode.com
首页 > 其他好文 > 详细

(四)STL剖析——List

时间:2016-08-12 06:49:51      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:stl list

List.h

#ifndef __List__
#define __List__

#include "Iterator.h"
#include "Alloc.h"
#include "Construct.h"

//STL对于区间前闭后开

//List的节点
template<class T>
struct ListNode
{
	typedef ListNode<T>* Node_p;
	Node_p _prev;
	Node_p _next;
	T _data;
	ListNode(const T& data=T() )
		:_prev(NULL)
		, _next(NULL)
		, _data(data)
	{}
};

//List中的迭代器(由于list不是线性空间结构,通用迭代器无法正常移动,所以list需要定义专门的迭代器。)
template<class T,class Ref,class Ptr>//???????????????
struct __ListIterator
{
	//List使用的迭代器应该是可双向移动的(五种相应型别必须有,或者继承struct Iterator)
	typedef BidirectionalIteratorTag IteratorCategory;
	typedef T ValueType;
	typedef Ptr Pointer;
	typedef Ref Reference;
	typedef ptrdiff_t DifferenceType;

	typedef __ListIterator<T, Ref, Ptr> Self;

	typedef ListNode<T> Node, *Node_p;
	Node_p _node;

	//__ListIterator(Node_p x) 
	//	: _node(x) 
	//{}
	__ListIterator()
	{}
	__ListIterator(Node_p node)
		:_node(node)
	{}
	//取节点的数值
	Ref operator*()const
	{
		return _node->_data;
	}
	Ptr operator->()const
	{
		return &(operator*());
	}
	bool operator == (const Self& x)
	{
		return (_node==x._node);
	}
	bool operator != (const Self& x)
	{
		return (_node != x._node);
	}
	Self& operator++()
	{
		_node = _node->_next;
		return *this;
	}
	Self operator++(int)
	{
		Self old = *this;
		++(*this);
		return old;
	}
	Self& operator--()
	{
		(_node = _node->_prev);
		return *this;
	}
	Self operator--(int)
	{
		Self old = *this;
		--(*this);
		return old;
	}
};

//template <class T, class Ref, class Ptr>
// BidirectionalIteratorTag IteratorCategory(const __ListIterator<T, Ref, Ptr>&) 
//{
//		return BidirectionalIteratorTag();
//}
//template <class T, class Ref, class Ptr>
//T* ValueType(const __ListIterator<T, Ref, Ptr>&) 
//{
//	return 0;
//}
//template <class T, class Ref, class Ptr>
//ptrdiff_t* DistanceType(const __ListIterator<T, Ref, Ptr>&) 
//{
//	return 0;
//}

//List是一个带头结点的双向循环链表
template<class T, class Alloc = alloc>
class List
{
public:
	typedef SimpleAlloc<ListNode<T>, Alloc> ListNodeAllocator;

	typedef __ListIterator<T, T&, T*> Iterator;//STL强制要求
	typedef __ListIterator<T, const T&, const T*> ConstIterator;

	typedef T ValueType;
	typedef T& Reference;
	typedef const T& ConstReference;
	typedef T* Pointer;
	typedef const T* ConstPointer;
	//typedef List<T, Alloc> Self;
private:
	typedef ListNode<T> Node, *Node_p;

	Node* CreateNode(size_t size,const T& data=T())
	{
		//Node_p node = new Node(data);
		//分配内存
		Node* node = ListNodeAllocator::Allocate(size);
		//配置空间
		Construct(node, data);
		return node;
	}
	void DestroyNode(Node_p node)
	{
		//调用析构
		Destroy(node);
		//释放内存
		ListNodeAllocator::Deallocate(node);
	}
	
public:
	List()
		:_list(CreateNode(sizeof(Node)))
	{
		_list->_next = _list;
		_list->_prev = _list;
	}
	//List(Iterator first,Iterator last);
	//List(const List<T, Alloc>& l);
	//List<T,Alloc>& operator=(const List<T,Alloc>& l);
	~List()
	{
		Clear();
		//DestroyNode(Node_p node)
		//DestoryNode(_list);
		_list = NULL;
	}
	/*~List()
	{
		size_t size = Size();
		Destroy(Begin(),End());
		ListNodeAllocator::Deallocate(_list,size);
	}*/

	Iterator Begin() 
	{
		return _list->_next;
	}
	Iterator End() 
	{
		return _list;
	}
	ConstIterator Begin() const
	{
		return _list->_next;
		//return ConstIterator(_list->_next);
	}
	ConstIterator End() const
	{
		return _list->_next;
		//return ConstIterator(_list);
	}
	void PushBack(const T& data)
	{
		Insert(End(),data);
	}
	void PopBack()
	{
		Iterator tmp = End();
		Erase(--tmp);
	}
	void PushFront(const T& data)
	{
		Insert(Begin(),data);
	}
	void PopFront()
	{
		Erase(Begin());
	}
	//取头结点的内容(元素值)
	Reference Front()
	{
		return *Begin();
	}
	ConstReference Front()const
	{
	}
	Reference Back()
	{
		return *(--End());
	}
	ConstReference Back()const
	{
	}
	//在当前位置的前面插入
	void Insert(Iterator pos, const T& data)
	{
		Node_p cur = pos._node;
		Node_p prev = cur->_prev;
		//Node_p tmp = new Node(data);
		Node_p tmp = CreateNode(sizeof(Node),data);
		tmp->_next = cur;
		cur->_prev = tmp;
		prev->_next = tmp;
		tmp->_prev = prev;
	}
	Iterator Erase(Iterator pos)
	{
		Node_p cur = pos._node;
		Node_p prev = cur->_prev;
		Node_p next = cur->_next;
		prev->_next = next;
		next->_prev = prev;
		delete cur;
		return Iterator(next);
	}
	bool Empty()const
	{
		if (_list->_next == _list){
			return true;
		}
		else{
			return false;
		}
	}
	size_t Size()
	{
		/*size_t size;
		Distance(Begin(),End(),size);
		return size;*/
		int size = 0;
		Node_p start = _list->_next;
		Node_p end = _list;
		while (start != end){
			++size;
			start = start->_next;
		}
		return size;
	}
	void Clear()//All the elements in the list container are dropped
	{
		Iterator tmp = Begin();
		while (tmp != End()){
			//DestroyNode(*tmp);//error
			//DestroyNode(tmp._node);
			++tmp;
		}
		_list->_prev = _list;
		_list->_next = _list;
	}
	//assign函数用于重置list的内容
	//void assign(InputIterator first, InputIterator last);//用一段连续的空间重置
	//void assign(size_type n, const T& u);//用具体的值重置
	//void Remove(const T& x);
	//void Sort();
	//void Unique();
	//void Reverse();
	//void Merge(List<T,Alloc>& l);

	//接合函数,把以下内容接合到pos所指定的位置之前
	//一个链表的所有值
	//一个链表所指定的迭代器所指向的值
	//一个链表所指定的两个迭代器之间所指向的值
	//void Splice(Iterator pos,List<T,Alloc>& x);
	//void Splice(Iterator pos, List<T, Alloc>& x,Iterator it);
	//void Splice(Iterator pos, List<T, Alloc>& x,Iterator first,Iterator last);

	//Void Swap(List<T,Alloc>& l);

	//不支持随机访问,无[]重载
protected:
	Node_p _list;
};
#endif

Test.cpp

void printList1(List<int> l)
{
	List<int>::Iterator ite = l.Begin();
	*ite = 2;
	for (ite = l.Begin(); ite != l.End(); ++ite){
		std::cout << *ite << std::endl;
	}
}

void printList2(const List<int> l)
{
	List<int>::ConstIterator ite = l.Begin();
	//*ite = 2;
	for (ite = l.Begin(); ite != l.End(); ++ite){
		std::cout << *ite << std::endl;
	}
}

void TestList()
{
	/*std::list<aa> l1;
	std::list<aa>::iterator items;
	l1.push_back(aa());
	l1.push_back(aa(1, ‘b‘));
	l1.push_back(aa(2, ‘c‘));
	l1.push_back(aa(3, ‘d‘));
	items = l1.begin();

	for (; items != l1.end(); ){
		std::cout << items->_a << "  " <<items->_c <<std::endl;
		items++;
	}*/

	List<int> l;
	l.PushBack(1);
	l.PushBack(2);
	l.PushBack(3);
	l.PushBack(4);
	List<int>::Iterator ite;
	for (ite = l.Begin(); ite != l.End(); ++ite){
		std::cout << *ite << std::endl;
	}
	std::cout << l.Size() << std::endl;

	ite = l.Begin();
	l.Insert(ite,100);
	std::cout << *ite << std::endl;

	l.PopFront();
	l.PopBack();
	l.PushFront(78);
	l.PushFront(100);

	List<int>::Iterator it = l.Begin();
	List<int>::Iterator its = l.End();
	List<int>::Iterator item;
	std::cout<<*it<<std::endl;
	++it;
	its--;
	std::cout << (it != its) << std::endl;
	
	int data1 = l.Front();
	int data2= l.Back();
	std::cout<<l.Size()<<std::endl;
	std::cout << !l.Empty() << std::endl;


	//list<int> l;
	//l.PushBack(1);
	//l.PushBack(2);
	////printlist1(l);
	//printlist2(l);
}


本文出自 “零蛋蛋” 博客,谢绝转载!

(四)STL剖析——List

标签:stl list

原文地址:http://lingdandan.blog.51cto.com/10697032/1837112

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!