自己造容器List
//自己造容器--List
/*
1、iterator
2、头迭代器
3、尾迭代器
4、链表长
5、判空
6、清除
7、取头元素
8、取尾元素
9、头插入
10、尾插入
11、头删除
12、尾删除
13、插入函数
14、删除函数
*/ template<typename Object>
class List
{
private:
//结点
struct Node
{
Object data;
Node *prev; //前置指针
Node *next; //后置指针 Node(const Object & d = Object(), Node*p = NULL, Node*n = NULL) : data(d), prev(p), next(n){}
}; public:
//迭代器
class const_iterator
{
public:
const_iterator() :current(NULL){} //*重载
const Object & operator*()const
{
return retrieve();
} //pre++重载
const_iterator & operator++() //前置++,返回引用
{
current = current->next;
return *this; //this是一个指向iterator的指针
} //pre--
const_iterator & operator--() //前置--,返回引用
{
current = current->prev;
return *this; //this是一个指向iterator的指针
} //pos++重载
const_iterator operator++(int) //后置++,返回参数
{
const_iterator old = *this;
++(*this);
return old;
} //pos--
const_iterator operator--(int) //后置--,返回参数
{
const_iterator old = *this;
--(*this);
return old;
} //==重载
bool operator==(const const_iterator & rhs)const
{
return current == rhs.current;
} //!=重载
bool operator!=(const const_iterator & rhs)const
{
return !(current == rhs.current);
} protected: //在一般迭代器中变为private
Node*current; Object &retrieve()const
{
return current->data;
} const_iterator(Node*p) :current(p){} friend class List<Object>;
}; //一般迭代器继承常迭代器
class iterator : public const_iterator
{
public:
iterator(){} Object &operator*()
{
return retrieve();
} //以免被上一个operator*覆盖
const Object& operator*()const
{
return const_iterator::operator*();
} //pre++
iterator operator++()
{
current = current->next;
return *this;
} //pre--
iterator operator--()
{
current = current->prev;
return *this;
} //pos++
iterator operator++(int)
{
iterator old = *this;
++(*this);
return old;
} //pos--
iterator operator--(int)
{
iterator old = *this;
--(*this);
return old;
}
protected:
iterator(Node*p) : const_iterator(p){} friend class List<Object>;
}; public:
//the big three
List()
{
init();
} ~List()
{
clear();
delete head;
delete tail;
} List(const List &rhs)
{
init();
*this = rhs;
} const List& operator=(const List & rhs)
{
if (this == &rhs)
return *this;
clear();
for (const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr)
push_back(*itr);
return *this;
} //头迭代器
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);
} //链长
int size()const
{
return theSize;
} //判空
bool empty()const
{
return size() == 0;
} //清除
void clear()
{
while (!empty())
{
pop_front();
}
} //取头元素
Object & front()
{
return *begin();
} const Object & front()const
{
return *begin();
} //取尾元素
Object & back()
{
return *--end();
} const Object & back()const
{
return *--end();
} //前插
void push_front(const Object&x)
{
insert(begin(), x);
} //后插
void push_back(const Object&x)
{
insert(end(), x);
} //前删
void pop_front()
{
erase(begin());
} //后删
void pop_back()
{
erase(--end());
} //插入
iterator insert(iterator itr, const Object &x)
{
theSize++;
Node *p=itr.current;
/*Node*q=new Node(x, p->prev, p);
p->prev->next=q;
p->prev=q;
return iterator(q);
*/
return iterator(p->prev = p->prev->next = new Node(x, p->prev, p));
} //单个删除
iterator erase(iterator itr)
{
Node*p = itr.current;
iterator retVal(p->next);
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
theSize--; return retVal;
} //多个删除
iterator erase(iterator start, iterator end)
{
iterator itr;
for (itr = start; itr != end;)
itr = erase(itr);
return itr;
} private:
int theSize;
Node *head;
Node *tail; void init()
{
theSize = 0;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
};
自己造容器List的更多相关文章
- 一步一步造个IoC轮子(三):构造基本的IoC容器
一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):Ioc是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 定义容器 首先,我们来画个大饼, ...
- 《回炉重造 Java 基础》——集合(容器)
整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...
- 造轮子:实现一个简易的 Spring IoC 容器
作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...
- 【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去
适用于:.net2.0+ Winform项目 ------------------201508261813更新(源码有更新.Demo未更新)------------------ 重新绘制调整大小手柄( ...
- C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》
再一次遇到 vector 这个单词; 每一次见到这个单词都感觉这个单词非常的 "高大上"; 数字遇到vector马上就可以360度旋转: 当 "电" 遇到vec ...
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...
- 自己动手写spring容器(1)
毕业刚刚一年多一点,毕业了后也顺利的进入了一家著名的互联网公司,做的是后台系统,用的呢也是SSI(struts2,spring)框架,平时做做项目,也已足够了,但是感觉越来越没动力了,越来越没有激情了 ...
- IOC容器Unity的使用及独立配置文件Unity.Config
[本段摘录自:IOC容器Unity 使用http://blog.csdn.net/gdjlc/article/details/8695266] 面向接口实现有很多好处,可以提供不同灵活的子类实现,增加 ...
- Spring总结_04_容器和bean
一.概念理解 1.容器 IoC容器负责容纳并管理bean,在Spring中,BeanFactory是IoC容器的核心接口. 它的职责包括:实例化.定位.配置应用程序中的对象及建立这些对象间的依赖. ...
随机推荐
- android 实现与服务器的长链接 方式
http://blog.csdn.net/coffeeco/article/details/13276437 这边文章主要看服务端,使用tomcat7以上实现服务端的接收消息以及消息发送 http: ...
- 设计模式 -- 代理模式 (Proxy Pattern)
定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...
- Mysql登录后看不到数据库
进入数据库后,只能看到information_schema/test这两个库,其他的数据库都看不到,这是权限出了问题. 关闭Mysql /usr/local/mysql/support-files/m ...
- 《Intel汇编第5版》 条件汇编伪指令
一.条件汇编伪指令和宏使用可以使汇编程序更加灵活 二.通过伪指令来检查函数的参数是否为空,如果为空则输出警告信息 INCLUDE Irvine32.inc includelib Irvine32.li ...
- iOSAPP添加启动页
如果你在开发过程中出现屏幕显示内容比例不正常或者显示不全的问题,你发现不是代码或者约束的问题,那么很可能是启动页没有添加或者添加不全的原因,下面配一张问题图片上下黑屏 添加启动页步骤如下图 (1) ( ...
- ural 1100. Final Standings(数据结构)
1100. Final Standings Time limit: 1.0 secondMemory limit: 16 MB Old contest software uses bubble sor ...
- 语义化标签SEO
语义标签 title 和 h1 的区别,我的理解是: title 是整个网页的标题,突出整个网站的内容,H1 突出的是一篇文章的内容. b 与 strong 的区别,b只是样式的加粗,strong 是 ...
- portal安装常见问题
1.创建portaladmin的url? https://portal.smart.ningbo:7443/arcgis/home/createadmin.html 2.创建portaladmin一闪 ...
- ogg 初始化
192.168.27.33test11ghdb11gtrandata: 同步delete,update 使用config 文件:同步表使用进程根据SCN号和RBA和主键同步##目的:数据定时同步,从源 ...
- hive-1.2.1安装步骤
一.Hive安装和配置 1.先决条件 已经安装好hadoop-2.4.1,hbase-1.0.0. 2.下载Hive安装包 当前Hive可到apache官网下载,选择的是hive-1.2.1.运行: ...