阉割的List
实在忍不住,模仿STL写了个阉割版的List,还没加迭代器,等搞完STL源码再说吧。
#pragma once
#include <stdexcept>
namespace vlyf
{
template <typename Key>
struct Node
{
using pointer = Node*;
Key key;
Node* prev{ nullptr };
Node* next{ nullptr };
Node() = default;
Node(Key const& k) : key(k) {}
};
template <typename T>
class List
{
public:
typedef typename Node<T>::pointer linkType;
private:
linkType head{ new Node<T> };
public:
List()
{
head->prev = head;
head->next = head;
}
~List() = default;
linkType Begin() const { return head->next; }
linkType End() const { return head; }
linkType Search(T const&) const;
linkType Erase(linkType position);
void Insert(linkType position, T const& x);
void PushBack(T const& x) { Insert(End(), x); }
void PushFront(T const& x) { Insert(Begin(), x); }
void PopFront() { Erase(Begin()); }
void PopBack()
{
linkType tmp = End()->prev;
Erase(tmp);
}
void Clear();
void Remove(T const& x);
void Unique();
void Delete(T const& x);
protected:
void Transfer(linkType position, linkType first, linkType last);
};
template <typename T>
inline typename List<T>::linkType List<T>::Search(T const& k) const
{
if (!head)
throw std::out_of_range("List is empty");
linkType p = head;
while (p->key != k)
{
p = p->next;
}
return p;
}
template <typename T>
inline void List<T>::Insert(List<T>::linkType position, T const& x)
{
linkType node = new Node<T>(x);
node->next = position;
node->prev = position->prev;
position->prev->next = node;
position->prev = node;
}
template <typename T>
inline void List<T>::Delete(T const& x)
{
if (!x->prev)
x->prev->next = x->next;
else
head->next = x->next;
if (!x->next)
x->next->prev = x->prev;
delete x;
}
template <typename T>
inline typename List<T>::linkType List<T>::Erase(typename List<T>::linkType position)
{
linkType nextNode = position->next;
linkType prevNode = position->prev;
prevNode->next = nextNode;
nextNode->prev = prevNode;
delete position;
return nextNode;
}
template <typename T>
inline void List<T>::Clear()
{
linkType cur = head->next;
while (cur != head)
{
linkType tmp = cur;
cur = cur->next;
delete tmp;
}
head->next = head;
head->prev = head;
}
template <typename T>
inline void List<T>::Remove(T const& x)
{
linkType first = Begin();
linkType last = End();
while (first != last)
{
linkType tmp = first;
tmp = tmp->next;
if (x == first->key)
{
Erase(first);
}
first = tmp;
}
}
template <typename T>
inline void List<T>::Unique()
{
linkType first = Begin();
linkType last = End();
if (first == last)
return;
linkType next = first->next;
while (next != last)
{
if (next->key == first->key)
Erase(next);
else
first = next;
next = first->next;
}
}
template <typename T>
inline void List<T>::Transfer(linkType position,
linkType first,
linkType last)
{
last->prev->next = position;
first->prev->next = last;
position->prev->next = first;
linkType tmp = position->prev;
position->prev = last->prev;
last->prev = first->prev;
first->prev = tmp;
}
} // namespace vlyf
阉割的List的更多相关文章
- JQuery向导插件Step——第一个阉割版插件
如果使用过JQuery Steps的朋友一定会发现这个插件有一个缺点,就是页面在第一次进入的时候,会进行一次很明显的DOM重绘--页面会闪一下. 尤其是前端代码比较庞大的时候,效果更为明显. 为了解决 ...
- 【Access2007】解救被阉割的truncate
Access2007使用被阉割的J-SQL语句,语法跟T-SQL语句.也就是寻常最标准的SQL语句一模一样,但就是仅保留insert into,delete,select,update与没太大意义的过 ...
- 编译原理作业(第一次)-完成retinf.c(阉割版)
首先,作业要求概括如下: 根据前缀表达式文法,实现statements() 和expression() 两个函数. 并且要求使得语义分析在完成分析前缀表达式并输出中间代码的同时,也能够将前缀表达式翻译 ...
- 某某D的手伸的实在太长了,路由器也未能幸免,致被阉割的TP-Link
前段时间整了个服务器架上l2tp.server, TP-Link路由连上去后,全网走l2tp通道,而且不能配置相关的路由表 然后研究啊 找啊 查啊,确定是路由没有这功能 找客服问了一下,他一听就懂了, ...
- 阉割版BBBlack安装Debian
开门见山,直入主题 咸鱼入手3块阉割ARM板,经过快递近6天运输到手,不过价格便宜 东西下面这样的(借了咸鱼的图): 发现这块板是阉割版的国外beagleboard.org型号为BeagleBone ...
- 在ANTMINER(阉割版BeagleBone Black)运行Debain
开门见山,直入主题 咸鱼入手3块阉割ARM板,经过快递近6天运输到手,不过价格便宜 东西下面这样的(借了咸鱼的图): 发现这块板是阉割版的国外beagleboard.org型号为BeagleBone ...
- 做阉割版Salesforce难成伟大的TOB企业
https://www.lieyunwang.com/archives/446227 猎云注:当前中国市场环境下,有没有可能诞生一批SaaS级企业服务公司?东方富海合伙人陈利伟用三个方面基础性问题解答 ...
- 那些被刻意“阉割”的名人名言
"天才是百分之一的灵感,百分之九十九的汗水",这句名言大家都知道的吧!不过还有好多人不知道的是这句名言还有后半句:"但百分之一的灵感甚至比百分之九十九的汗水更重要.&qu ...
- 启用Win8(中文版/核心版)中被阉割的远程桌面服务端
Windows 8/8.1 标准版(中文版/核心版)中取消了远程桌面服务端,想通过远程连接到自己的电脑就很麻烦了,第三方远程桌面速度又不理想(如TeamViewer).通过以下方法可让系统恢复远程桌面 ...
随机推荐
- C#使用Redis实现网站统计访问数或点赞数功能!
1.安装.net操作Redis需要的NuGet包: 这里推荐使用:StackExchange.Redis,在程序包管理器控制台输入命令install-package stackexchange.red ...
- Maven学习 一 (下载安装)
Maven简介 Apache Maven 是一个软件项目管理工具.基于项目对象模型(project Object Model ,POM)的概念,Maven可用来管理项目的依赖,编译,文档等信息 使用M ...
- Spring事务源码解析(二)获取增强
在上一篇文章@EnableTransactionManagement注解解析中,我们搭建了源码阅读的环境,以及解析了开启Spring事务功能的注解@EnableTransactionManagemen ...
- QGraphicsItem鼠标精准拾取(pick/select)研究
在QT场景视图中,一个2D图形项是一个QGraphicsItem,我们可以通过继承来定义我们自己的图形项. 主要有以下三个虚函数需要重点关注: 1) 边界矩形(必须实现) virtual QRec ...
- Unity3D协程(转)
这篇文章转自:http://blog.csdn.net/huang9012/article/details/38492937 协程介绍 在Unity中,协程(Coroutines)的形式是我最喜欢的功 ...
- ChengDu University Mental Health Test 需求分析文档
ChengDu University Mental Health Website 需求分析文档 V4.0 编制人:刘雷,黄凯 日期:2019/4/28 版本修订历史记录: 版本 日期 修改内容 作者 ...
- PCA 在手写数字数据集上的应用
在 skilearn 的手写数据集中,每个数据点都是 0 到 9 之间手写数字的一张 8*8 灰度图像.用 PCA 将其降维到二维,并可视化数据点,如下: 1.digits 数据演示: from sk ...
- ie和谷歌的兼容性问题
1.表单的归类 ie下的表单元素在设置了disabled禁用属性之后,在ie下点击,仍然会有焦点.谷歌这是正常的没有焦点 解决方法:给表单元素设置增加属性 unselectable='on' 即可.
- 梳理Linux中断处理子系统
请根据下面链接进行学习: 软件方面可以参考蜗窝科技关于中断子系统的一系列文章<Linux中断子系统>,一共9篇文章,讲述了Linux中断的方方面面. <综述>是一个导论性质文档 ...
- Vue中美元$符号的意思与vue2.0中的$router 和 $route的区别
vue的实例属性和方法 除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来.例如: var data = { a: 1 } var vm = n ...