自己造容器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容器的核心接口. 它的职责包括:实例化.定位.配置应用程序中的对象及建立这些对象间的依赖. ...
随机推荐
- 分离JavaScript
分离JavaScript类似于使用style属性,在HTML文档里使用诸如onclick之类的属性也是一种既没有效率又容易引发问题的做法.如果我们用一个"挂钩",就像CSS机制中的 ...
- Navicat连接不上MySQL
[root@localhost init.d]# pwd /etc/init.d [root@localhost init.d]# mysql -u root -p Enter password: E ...
- 谷歌游览器对<input type='file'> change只能响应1次解决和样式的改变
在项目过程中遇到的需要上传本地文件,file的原始控件不太美观,但是这个控件和button有点不太一样, 改变这个样式的思路就是在控件外面套一层链接,然后把file控件的透明度设置为0(透明).样式只 ...
- USACO 3.2 Factorials
Factorials The factorial of an integer N, written N!, is the product of all the integers from 1 thro ...
- ubuntu16.04 禁用Guest用户
.打开终端(快捷键 Ctrl+Alt+T) .编辑50-no-guest.conf文件,按照以下命令编辑, sudo gedit /usr/share/lightdm/lightdm.conf.d/- ...
- 【3】JavaScript编程全解笔记(三)
减少重复劳动,抓住核心. 第 4 部分 HTML5 1. HTML 技术分类 与 API 2. ApplicationCache 缓存 第 15 章 与桌面应用的协作 第 17 章 WebSocket ...
- SQLite语句
搜索某属性: select exp from player where level = 2; 创建表: create table player (level integer primary key, ...
- DrawerLayout,ToolBar 和 TabHost 的使用
ActionBar 定义起来不方便 toolbar: 最重要的特性,显示menu菜单,右上角三个点的菜单按钮,使用灵活 使用:1,布局文件,包裹LinearLayout 放imageView, 或者I ...
- Registry Workshop(注册表编辑器) V4.6.3 官方中文版
软件名称: Registry Workshop(注册表编辑器)软件语言: 简体中文授权方式: 免费试用运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 1.1MB图 ...
- view 上推效果
http://www.cocoachina.com/ios/20160307/15586.html