list 链表
#include <list>
#include <iostream>
using std::list; /*
双向环状链表
//每一个结点 一个数据域 一个前驱指针 一个后驱指针
随机插入方便0(1) 随机访问效率低0(n)
*/ bool foo(int a) {
return a % == ;
} bool foo2(int a) {
return a == ;
} int main()
{
//初始化列表
list<int> list_test1;
list<int> list_test2();//5个结点的链表 默认值是0
list<int> list_test3(,);
list<int> list_test4(list_test3);
list<int> list_test5= list_test4; //末尾插入
list_test1.push_back();
list_test1.push_back();
list_test1.push_back(); //末尾删除
list_test1.pop_back(); //和vector的区别
//排序
list_test1.sort();
//前侧插入
list_test1.push_front();
//前侧删除
list_test1.pop_front(); //merge 合并两个有序链表再排序
list_test1.merge(list_test2); //清除指定值的元素 remove
list_test1.remove(); //清除满足条件的元素 remove_if 参数是返回bool的函数指针
list_test1.remove_if(foo);
list_test1.remove_if(foo2);//条件返回值必须是bool //splice 拼接结合 //unique() 删除重复值,保证唯一
list_test1.unique(); for (auto& i : list_test1) {
std::cout << i << std::endl;
}
}
自写
#pragma once
#include <memory> using namespace std;
/*
list结点 |next|---->|next|---->|next|
|prev|<----|prev|<----|prev|
|data| |data| |data| */
template <typename T>
struct __list_node
{
typedef __list_node* list_node_pointer;
list_node_pointer next;
list_node_pointer prev;
T data;
}; /*
list迭代器 操作容器
*/
template <typename T>
struct __list_iterator
{
typedef __list_iterator<T> self;
typedef __list_node<T> * link_type; link_type ptr;//指向list结点的指针 头指针 __list_iterator(link_type p = nullptr) :ptr(p) {}//构造
__list_iterator(const self& that) :ptr(that.ptr) {}//拷贝构造 bool operator==(const self& that) const
{
return this->ptr == that.ptr;
}
bool operator!=(const self& that) const
{
return this->ptr != that.ptr;
}
T& operator*()const
{
return ptr->data;
}
T* operator->()const
{
return &(operator*());
}
//迭代器前++ 返回下一个结点
self& operator++()
{
ptr=ptr->next;//指针指向下一个结点
return *this;
} //后++ 先返回后自增
self operator++()
{
self tmp = *this;
++*this;//调用了前面写的前++的操作
return tmp;
} //迭代器前-- 返回上一个
self& operator--()
{
ptr = ptr->prev;//指针指向上一个结点
return *this;
} //后-- 先返回后自减
self operator--()
{
self tmp = *this;
--*this;
return tmp;
}
}; /*
list
*/
template <typename T>
class MyList
{
protected:
typedef __list_node<T> list_node;
//空间配置器 内存池实现小块内存的分配机制
/*
大概实现
一级空间配置器 直接封装了malloc free
二级空间配置器 内存池 自有链表
实现原理 用户申请内存》128? 一级:二级 */
allocator<list_node> nodeAllocator; typedef T value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type& reference;
typedef size_t size_type; public:
typedef list_node* link_type;
typedef __list_iterator<T> iterator; protected:
//只要一个结点指针可以表示整个list
link_type node; //指向list结点的指针 头指针 //空间配置器
//分配新节点(内存) 不会进行构造
list_node alloc_node()
{
return = nodeAllocator.allocate(sizeof(list_node));
} //释放结点不会进行析构
void dealloc_node(list_node p)
{
nodeAllocator.deallocate(p);
} //分配新结点(内存) 用value构造新节点里面内容
list_node alloc_dtor_node(const T& value)
{
//分配结点空间
link_type p = alloc_node();
//构造结点内容
nodeAllocator.construct(&p->data, value);
} //析构整个结点 释放内存
void dealloc_dtor_node(list_node p)
{ } //空的初始化
void empty_init()
{
node = alloc_node();//分配一个结点空间 让node指向他
node->prev = node;//指向他自己
node->next = node;
}
public:
MyList()//链表初始化
{
empty_init()
}
~MyList(); iterator begin()
{
return node->next;
}
iterator begin() const
{
return node->next;
}
iterator end()
{
return node;
}
iterator end() const
{
return node;
} bool empty()const
{
return node == node->next;//结点指向他自身
//return node== node->prev;
} iterator insert(iterator pos, const T& value)
{
//先创造一个结点
link_type tmp = alloc_dtor_node(value);
//寻找位置插入
node->next = pos.node;
node->prev = pos.prev; pos.node->prev->next = tmp;
pos.node->prev = tmp; return tmp
} void push_back(const T& value)
{
insert(end(), value);
}
private: };
list 链表的更多相关文章
- Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
- 数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
随机推荐
- MariaDB 创建表
在本章中,我们将学习如何创建表. 在创建表之前,首先确定其名称,字段名称和字段定义. 以下是表创建的一般语法: CREATE TABLE table_name (column_name column_ ...
- for循环语句示例
for循环语句示例 一判断/var/目录下所有文件的类型 完整脚本 [root@centos73 ~]# cat shell_scripts/filetype.sh #!/bin/bash #Auth ...
- php strrev()函数 语法
php strrev()函数 语法 strrev()怎么用? php strrev()函数用于反转字符串,语法是strrev(string),返回已反转的字符串.大理石构件来图加工 作用:反转字符串 ...
- UNP学习第九章 基本名字与地址转换
之前都用数值地址来表示主机(206.6.226.33),用数值端口号来标识服务器. 然而,我们应该使用名字而不是数值:名字比较容易记,数值地址可以改变但名字保持不变. 随着往IPv6上转移,数值地址变 ...
- centos7.5部署ELk
第1章 环境规划 1.1 ELK介绍 ELK是ElasticSerach.Logstash.Kibana三款产品名称的首字母集合,用于日志的搜集和搜索. Elasticsearc ...
- Security基础(一):Linux基本防护措施、使用sudo分配管理权限、提高SSH服务安全
一.Linux基本防护措施 目标: 本案例要求练习Linux系统的基本防护措施,完成以下任务: 修改用户zhangsan的账号属性,设置为2015-12-31日失效(禁止登录) 锁定用户lisi的账户 ...
- Linux终端提示符颜色设置
将以下语句添加到用户目录下的 .bashrc 文件中,然后执行 source .bashrc 使其立即生效. PS1='${debian_chroot:+($debian_chroot)}\[\033 ...
- IIS发布获取apk文件,部署IIS遇到的问题记录
今天需要帮着测试一下PDA的检测更新功能,所以需要把web部署到IIS上. 在部署的时候,遇到了两个小问题. 一.web 服务器被配置为不列出此目录的内容. 解决办法:1.按照提示的可尝试操作,启用了 ...
- Excel表格文本格式的数字和数字格式如何批量转换
Excel表格文本格式的数字和数字格式如何批量转换 在使用Excel表格对数据求和时,只能对单元格内常规格式的数据进行计算,而不能对单元格中的文本格式的数据进行计算,特点就是在单元格的左上角有一个绿色 ...
- upc组队赛2 Hakase and Nano【思维博弈】
Hakase and Nano 题目描述 Hakase and Nano are playing an ancient pebble game (pebble is a kind of rock). ...