`

list 模板类的简单实现

阅读更多

 

最近学数据结构,于是尝试着去实现了一个 list 类,发现确实有很多问题,特别是类的继承这一块,有些问题搞不懂……

这个 list  类只是一个简单的实现,只提供了基本的功能,也没有边界检测什么的,越界访问的问题由使用者自己把握……

很多功能都是没有实现的,总得来说这是一个比较裸的 list 模板类,没有什么实用价值……

 

/* THE PROGRAM IS MADE BY PYY */

//#include <iostream>
//#include "class.h"

//using namespace std ;

//////////////////////////////////////////////////////////////////////////
//
// Decleration
//

template <class T>
class Node ;

template <class T>
class List ;

template <class T>
class const_Iterator ;

template <class T>
class Iterator ;

//////////////////////////////////////////////////////////////////////////
//
// Node
//

template <class T>
class Node {
	friend class List<T> ;
	friend class const_Iterator<T> ;
	friend class Iterator<T> ;
private:
	T 			elem ;
	Node		*prev ;
	Node	 	*next ;
	
	Node (const T &t = *(new T), Node *p = 0, Node *n = 0)
		: elem(t), prev(p), next(n) {}
} ;

//////////////////////////////////////////////////////////////////////////
//
// const_Iterator
//

template <class T>
class const_Iterator {
	friend class List<T> ;
protected:
	typedef const_Iterator<T> ci_t ;
public:
	const_Iterator (Node<T> * n) : pNode(n) {}
	const_Iterator (const ci_t &ci)
		: pNode(ci.pNode) {}
	const T & operator* () const { return pNode->elem ; }
	const T * operator->() const { return &pNode->elem ; }
	ci_t operator= (const ci_t &ci) { pNode = ci.pNode ; return *this ; }
	// ++
	ci_t & operator++() { pNode = pNode->next ; return *this ; }
	ci_t   operator++ (int) {
		ci_t  ci(*this) ;
		pNode = pNode->next ;
		return ci ;
	}
	// --
	ci_t & operator--() { pNode = pNode->prev ; return *this ; }
	ci_t   operator--(int) {
		ci_t ci(*this) ;
		pNode = pNode->prev ;
		return ci ;
	}
	// ==
	bool operator== (const ci_t &ci) const {
		return pNode == ci.pNode ;
	}
	bool operator!= (const ci_t &ci) const {
		return !(*this == ci) ;
	}
protected:
	Node<T>	*pNode ;
} ;

//////////////////////////////////////////////////////////////////////////
//
// Iterator
//
template <class T>
class Iterator: public const_Iterator<T> {	
	friend class List<T> ;
	using const_Iterator<T>::pNode ; // 不加这句,codeblocks 就一直提示错误:
	// error: 'pNode' was not declared in this scope|
public:
	Iterator (Node<T> * n) : const_Iterator<T>(n) {}
	Iterator (const Iterator &ci): const_Iterator<T>(ci) {}
	Iterator operator= (const Iterator &ci) { pNode = ci.pNode; return *this ;}

	T & operator* () { return const_Iterator<T>::pNode->elem ; }
	T * operator->() { return &const_Iterator<T>::pNode->elem ; }

	// 不重定义这些操作符,所有对 Iterator 的操作(++,--)的结果都会返回 基类,
	// 导致无法实现这些 修改内容 的语句:erase (--end()) ;
	// 编译器会提示,const_Iterator<T> 类无法转换为 Iterator<T> 类
	Iterator & operator-- () {
		pNode = pNode->prev ;
		return *this ;
	}
	Iterator   operator-- (int) {
		Iterator itr(*this) ;
		pNode = pNode->prev ;
		return itr ;
	}
	Iterator & operator++ () {
		pNode = pNode->next ;
		return *this ;
	}
	Iterator   operator++ (int) {
		Iterator itr(*this) ;
		pNode = pNode->next ;
		return itr ;
	}
} ;

//////////////////////////////////////////////////////////////////////////
//
// List, 简单实现,无错误检测,无边界检测
//

template <class T>
class List {
public:
	typedef const_Iterator<T>	const_iterator ;
	typedef Iterator<T>			iterator ;
public:
	// Copy controy
	List () { init () ; }
	~List () { 
		clear () ; 
		delete head ;
		delete tail ;
	}
	const List<T> & operator= (const List<T> &rhs) {
		if (this == &rhs)
			return *this ;
		clear () ;
		for (const_iterator itr = rhs.begin () ; itr != rhs.end() ; ++itr)
			push_back (*itr) ;
		return *this ;
	}
	
	// Iterators
	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) ; }
//	rbegin () ;
//	rend () ;
	
	// Capacity
	bool	empty 	() const { return !theSize ; }
	int 	size 	() const { return  theSize ; }
//	max_size () ;
//	resize () ;
	
	// Element access
	T 		  front () 		 { return *begin () ; }
	const T	  front () const { return *begin () ; }
	T		  back  () 		 { return *--end () ; }
	const T   back	() const { return *--end () ; }
	
	// Modifiers
//	assign () ;
	void push_front (const T &t) 	{ insert (begin(), t) ; }
	void pop_front 	() 				{ erase  (begin()) ; 	}
	void push_back 	(const T &t) 	{ insert (end(), t) ; 	}
	void pop_back 	() 				{ erase  (--end()) ; 	}
	
	// 只能修改 iterator 类指定的内容,如果 const_iterator 类传进来,就会提示
	// 基类 无法转换为 继承类。从而导致编译不通过
	iterator insert (iterator itr, const T &t) {
		++theSize ;
		
		Node<T> *pCurNode = itr.pNode ;
		return iterator(
			pCurNode->prev = pCurNode->prev->next = 
			new Node<T>(t, pCurNode->prev, pCurNode)) ;
	}
	iterator erase (iterator itr) {
		Node<T> *curNode = itr.pNode ;
		Node<T> *nextNode = curNode->next ;
		curNode->prev->next = curNode->next ;
		curNode->next->prev = curNode->prev ;
		
		delete curNode ;
		--theSize ;
		return iterator(nextNode) ;
	}
	iterator erase (iterator start, iterator end) {
		while (!empty() && (start != end))
			start = erase (start) ;
		return end ;
	}
//	swap
	void clear () { erase (begin(), end()) ; }
	
/*
	// Operations
	splice
	remove
	remove_if
	unique
	merge 
	sort 
	reverse 
	
	// Allocator
	get_allocator
*/

private:
	Node<T>		*head ;
	Node<T>		*tail ;
	int			theSize ;
	
	void init () {
		head = new Node<T> ;
		tail = new Node<T> ;
		
		head->next = tail ;
		tail->prev = head ;
		
		theSize = 0 ;
	}
} ;
 
0
0
分享到:
评论

相关推荐

    实现一个模板类的链表(c++)

    3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_...

    标准模板库STL

    一份讲解全面的标准模板库STL学习资料 ... 头文件中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。容器使用allocator完成对内存的操作,allocator提供内存原语以对内存进行统一的存取。

    微信小程序实现列表的横向滑动方式

    方式一:简单样式实现 父元素设置: white-space:nowrap;//不换行 overflow-x: auto;子元素设置: display:inline-block; 方式二:scroll-view 标签 + 样式 scroll-view的横向滚动: scroll-view的内层view元素需要...

    单向链表模板

    用模板实现的单向链表的增删改查的功能,简单实用,只是一个头文件,可适用于各种数据结构和类,是学习模板和单向链表的绝好参考

    传智播客扫地僧视频讲义源码

    22_案例_数组模板类_类的实现和测试_传智扫地僧 23_案例_数组模板类_数组元素存储的是类对象思想抛砖_传智扫地僧 24_作业 代码 文档 01_泛型编程_知识点梳理 02_模板数组类_作业讲解和思想强化(数据类型和算法的分离...

    C++课程作业基于跳表实现的轻型键值型数据库源码+项目说明.zip

    &gt; - 本项目使用了类模板进行编程;实现了对数据的增删改查,以及数据落盘和文件加载数据等功能;对数据库性能进行了简单的压力测试,采用了随机写读的方法,在不同数据规模下获得了每秒可处理请求数(QPS)指标。 &gt; ...

    [原创]自己工作中常用的模板库,简化你的工作

    本库采用了封装,可以支持模板函数的回调,并且支持最多7个可变参数(可以简易扩充参数个数)。 可以遍历一个TypeList或者枚举值范围CEnumRange,然后以满足条件的类型回调用户的模板函数。 其广泛的应用场景即是...

    cms后台管理

    就是简单的将tag_list中的内容,即“paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list));”中放入的数据遍历出来 style_2-1.html中的内容 主要是对图文列表或标题列表向上滚动的样式的,其中包含两个同样为样式...

    asp.net猎头管理系统源码

    功能介绍: 该系统为猎头日常工作所使用系统,包括一般猎头软件所有功能,主要模块有:简历...3.系统角色权限管理采用重写page类的oninit方法,给每个页面以及每个功能赋予id,使得角色权限控制更简单明确,容易管理。

    vc++ 应用源码包_1

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...

    viewPager快速实现自定义页面滑动翻页.zip

    1.功能说明: 用户导入jar包后,只需要自己创建布局文件(xml布局文件),使用本jar包,即可生成可滑动的页面。...//注:因为此jar只适用于对性能要求不高,作为简单的模板使用,因此,未作性能优化。当然欢迎指教。

    vc++ 应用源码包_2

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...

    vc++ 应用源码包_6

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...

    vc++ 应用源码包_5

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...

    vc++ 应用源码包_3

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...

    springboot+beetlsql使用案例

    springboot+beetlsql使用案例: 优点:(1) 无需注解,能...(3)SQL模板基于B eetl实现,更容易写和调试,以及扩展 (4)可以针对单个表(或者视图)生成Pojo类和sql模型,甚至是整个数据库,能有效的减少代码的编写量

    TSYS信息发布系统 v2.0 beta1版

    [增加]资源碎片模板标签解析功能,可使用更佳个性、简易编程的标签函数(注:此类标签与资源模板标签实现了互用性!) [升级]资源特性,碎片的出现,使得资源特性的使用更为灵活。完全可实再,如:新闻专题,页面...

    Tsys信息发布系统 v2.0 beta1

    可使用更佳个性、简易编程的标签函数,如:left(), data(), pages_list(), filter_html()等 [增加]资源碎片模板标签解析功能,可使用更佳个性、简易编程的标签函数(注:此类标签与资源模板标签实现了互用性!...

    超炫的宁德社区论坛模板蓝色风格套装

    使用DZX特有的DIY数据调用功能实现内容的所有调用,设置简单容易上手; 3. 数据调用采用DZX默认缓存机制,不会增加社区负荷, 打开速度不受影响; 4. 所有调用图片自动生成缩略图功能, 有效解决调用图片变形失真的...

    vc++ 开发实例源码包

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 class CDHtmlSinkHandler; // Events Sink Base class CDHtmlEventSink; // IHTMLDocument2 Events Sink // IDispatch class ...

Global site tag (gtag.js) - Google Analytics