//自己造容器--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. Oracle常用查询

    -- 创建Oracle sequence create sequence SEQ_XXHF minvalue 1 maxvalue 9999999999999999999999999999 start ...

  2. cookie解决 未登录加入购物车 第一次访问弹出新手引导页面

    浏览器携带cookie到服务器, 点击加入购物车-->后台检查-->是否登录(有没有sessionid) 没有登录--->secookie()返回给浏览器,把传递过来的商品id, 属 ...

  3. linux操作系统简单使用

    文章将包含几个内容: linux简介 linux操作系统的安装简述 linux操作系统的磁盘文件结构 linux操作系统中的文件操作 linux中的用户管理 网络配置管理 常用系统管理指令 linux ...

  4. Unity3D脚本使用:Random

    实例: 为集合变量赋值,并运行,点击按钮,运行结果如图   

  5. 《C++反汇编与逆向分析技术揭秘》——观察各种表达式的求值过程

    ---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再 ...

  6. metasploit nessus & db_autopwn

    nessus官网:https://www.tenable.com/products/nessus-vulnerability-scanner 下载地址:https://www.tenable.com/ ...

  7. css 小知识

    <!-- IE下消除点击图片文字后出现的虚线框代码 --> <style type="text/css">a {blr:expression(this.on ...

  8. 洛谷-拼数-NOIP1998提高组复赛

    题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4 ...

  9. json_encode不编码中文字符的方式

    json_encode($array,JSON_UNESCAPED_UNICODE);

  10. Linux监控工具vmstat命令详解

        一.前言 很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回 ...