最近学数据结构,于是尝试着去实现了一个 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 ;
}
} ;
分享到:
相关推荐
3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_...
一份讲解全面的标准模板库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_模板数组类_作业讲解和思想强化(数据类型和算法的分离...
> - 本项目使用了类模板进行编程;实现了对数据的增删改查,以及数据落盘和文件加载数据等功能;对数据库性能进行了简单的压力测试,采用了随机写读的方法,在不同数据规模下获得了每秒可处理请求数(QPS)指标。 > ...
本库采用了封装,可以支持模板函数的回调,并且支持最多7个可变参数(可以简易扩充参数个数)。 可以遍历一个TypeList或者枚举值范围CEnumRange,然后以满足条件的类型回调用户的模板函数。 其广泛的应用场景即是...
就是简单的将tag_list中的内容,即“paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list));”中放入的数据遍历出来 style_2-1.html中的内容 主要是对图文列表或标题列表向上滚动的样式的,其中包含两个同样为样式...
功能介绍: 该系统为猎头日常工作所使用系统,包括一般猎头软件所有功能,主要模块有:简历...3.系统角色权限管理采用重写page类的oninit方法,给每个页面以及每个功能赋予id,使得角色权限控制更简单明确,容易管理。
ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...
1.功能说明: 用户导入jar包后,只需要自己创建布局文件(xml布局文件),使用本jar包,即可生成可滑动的页面。...//注:因为此jar只适用于对性能要求不高,作为简单的模板使用,因此,未作性能优化。当然欢迎指教。
ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...
ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...
ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...
ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了...
springboot+beetlsql使用案例: 优点:(1) 无需注解,能...(3)SQL模板基于B eetl实现,更容易写和调试,以及扩展 (4)可以针对单个表(或者视图)生成Pojo类和sql模型,甚至是整个数据库,能有效的减少代码的编写量
[增加]资源碎片模板标签解析功能,可使用更佳个性、简易编程的标签函数(注:此类标签与资源模板标签实现了互用性!) [升级]资源特性,碎片的出现,使得资源特性的使用更为灵活。完全可实再,如:新闻专题,页面...
可使用更佳个性、简易编程的标签函数,如:left(), data(), pages_list(), filter_html()等 [增加]资源碎片模板标签解析功能,可使用更佳个性、简易编程的标签函数(注:此类标签与资源模板标签实现了互用性!...
使用DZX特有的DIY数据调用功能实现内容的所有调用,设置简单容易上手; 3. 数据调用采用DZX默认缓存机制,不会增加社区负荷, 打开速度不受影响; 4. 所有调用图片自动生成缩略图功能, 有效解决调用图片变形失真的...
ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 class CDHtmlSinkHandler; // Events Sink Base class CDHtmlEventSink; // IHTMLDocument2 Events Sink // IDispatch class ...