//自己造容器--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的更多相关文章

  1. 一步一步造个IoC轮子(三):构造基本的IoC容器

    一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):Ioc是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 定义容器 首先,我们来画个大饼, ...

  2. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  3. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

  4. 【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去

    适用于:.net2.0+ Winform项目 ------------------201508261813更新(源码有更新.Demo未更新)------------------ 重新绘制调整大小手柄( ...

  5. C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》

    再一次遇到 vector 这个单词; 每一次见到这个单词都感觉这个单词非常的 "高大上"; 数字遇到vector马上就可以360度旋转: 当 "电" 遇到vec ...

  6. c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

    转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...

  7. 自己动手写spring容器(1)

    毕业刚刚一年多一点,毕业了后也顺利的进入了一家著名的互联网公司,做的是后台系统,用的呢也是SSI(struts2,spring)框架,平时做做项目,也已足够了,但是感觉越来越没动力了,越来越没有激情了 ...

  8. IOC容器Unity的使用及独立配置文件Unity.Config

    [本段摘录自:IOC容器Unity 使用http://blog.csdn.net/gdjlc/article/details/8695266] 面向接口实现有很多好处,可以提供不同灵活的子类实现,增加 ...

  9. Spring总结_04_容器和bean

     一.概念理解 1.容器 IoC容器负责容纳并管理bean,在Spring中,BeanFactory是IoC容器的核心接口. 它的职责包括:实例化.定位.配置应用程序中的对象及建立这些对象间的依赖. ...

随机推荐

  1. mac下 使用 versions版本控制工具 修复游戏bug过程

    1,首先拥有游戏源代码文件,修复bug之前先使用versions工具进行更新: 2,查找指定的bug之前,先运行游戏,在源代码中觉得是bug的地方打个断点,然后运行游戏的对应有bug的地方,看是否会有 ...

  2. TypeScript 学习二 表达式和循环

    表达式: 1,箭头表达式:将function用箭头代替,参数相应进行处理: 用来声明匿名函数,消除了传统匿名函数的this指针问题: 1) 例:简单的方法体为单行的方法,此时不需要大括号和return ...

  3. HDU------checksum

    Quicksum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. Android中设定EditText的输入长度

    方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText         android:id="@+id/editTextShow& ...

  5. WPF中override ResourceDictionary中的设置的方法

    当资源文件里改变了控件的样式时,在使用的地方如果想改变资源文件里修改的内容,会造成无法达到预期目的的结果. 以DataGrid为例,我在资源文件里,改变了默认的DataGrid的样式,其中我设置了Is ...

  6. jenkins jmeter持续集成批处理jmx脚本

    这篇文章介绍jenkis jmeter的持续集成,利用jenkins定时任务去批处理执行jmeter的jmx脚本文件,并且生成测试报告 1:jmeter的安装这里我就不在赘述了,如有问题可参考我的jm ...

  7. RedHat9.0下载地址

    RedHat下载:http://archive.download.redhat.com/pub/redhat/linux/9/en/iso/i386/

  8. 不安装rpm包,取出rpm包里的文件

    1.查看rpm包里的文件 [root@VM_166_132 ~]# rpm -qlp mysql5.6.29-1-3.x86_64.rpm |more/etc/ld.so.conf.d/mysql-5 ...

  9. 在iOS9中 xcode7 网络请求 如图片请求不显示等

    Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse ...

  10. Eclipse Bug: Unhandled event loop exception No more handles

    我的解决方法如下: I had the same problem, turned out that TeamViewer was causing this. In your TeamViewer go ...