STL源码分析(2) -- list.h分析(1)

STL源码分析 list容器 源代码来自sgi-2.91版本stl_list.h 链表中节点的定义 template <class T> struct __list_node { typedef void* void_pointer; void_pointer next; //指向前一节点 void_pointer prev; //指向后一节点 T data; //存储数据类型 }; list中的迭代器 //list类中的定义 typedef __list_iterator<T, T&am 阅读详情

  在第一次的博客中给大家说明了STL源码实现分为好几种,而且各家的实现方法有许多区别,作为初学者的我们,还是要挑软柿子捏,我们从相对来说比较容易理解的PJ版本开始分析,PJ版本一般在VC6.0中可以找到,我在上次的博客中也已经上传,同时还有两本相关的书籍,也都已经上传。

 在开始分析源代码之前,我们应该先对STL的组成有一个大概的认识,STL中主要包括六大组件,分别是容器(containers),算法(algorithms),迭代器(iterators),仿函数(functors),空间配置器(allocators),配接器(adapters).

    1.容器:保存着各种数据结构,如vector, list, deque, set, map....

    2.算法:常用算法,如sort,search,copy,erase.... 算法主要是对容器中保存的数据进行处理。

    3.迭代器:是容器和算法之间的胶合剂,就是所谓的“范型指针”,用来访问容器中的元素。

    4.仿函数:从实现的角度来说,即是在某一个类中对小括号进行重载,使其对象可以调用小括号,行为类似于函数。

    5.空间配置器:负责空间配置和管理,从实现的角度来看,配置器是一个实现了动态空间配置,空间管理,空间释放的class template。

    6.配接器:这个我们暂时不会用到,等用到的时候,我们再讨论。

  估计大家在看了上面的介绍之后,还是对STL没有什么概念,甚至还可能萌生退意。其实我觉得,上面的STL的六个组件虽然说的很玄乎,但其实只要你以前稍微写过一些链表的基本操作的函数,那对于你来说,STL对于你来说已经不是什么难事了,因为万变不离其宗,不管它的语法多么花哨,名字多么专业,只要我们肯伏下身子,去啃,那没有什么弄不懂的。

  接下来,我们就开始分析list.h这个头文件,也即就是STL中的链表,首先需要说明的是,STL中的链表是一个双向循环链表,先给大家一个图来感性的认识一下list。

  图画的不好,但是能说明问题就可以了。list的基本结构就如图所示。这里有一个关于命名的小知识,就是一般变量名字前面带下划线的,如_Prev,都说明该变量是一个内部变量,这只是一个大家都墨守成规的,并没有什么强制性要求。

  了解了list的大概结构,我们就开始看源代码,当然,如果一开始大家就拿着源代码啃,那肯定是难于上青天,而且效率也满,并不推荐,因为我们也不可能一次性就能把整个list全部分析完,所以今天的任务就是我们先可以创建出一个list,下来,我先贴出我们今天要完成的代码。

#pragma once
#include <malloc.h>

template <class _Type>
class list
{
public :
	list() : _Head(_Buynode()), _Size(0){};

protected :
	typedef size_t size_type;
	struct _Node;
	typedef 	struct _Node*	_Nodeptr;
	struct _Node
	{
		_Nodeptr _Prev, _Next;
		_Type	_Value;
	};			//链表的结点

	struct _Acc
	{
		typedef		struct _Node*&		_Nodepref;
		typedef 	_Type&				_Vref;
		static _Nodepref _Next(_Nodeptr _P)
		{return ((_Nodepref)(*_P)._Next);}
		static _Nodepref _Prev(_Nodeptr _P)
		{return ((_Nodepref)(*_P)._Prev);}
		static _Vref _Value(_Nodeptr _P)
		{return ((_Vref)(*_P)._Value);}
	};			

	_Nodeptr _Buynode(_Nodeptr _Next = 0, _Nodeptr _Prev = 0)
	{
		_Nodeptr _S = (_Nodeptr)malloc(sizeof(_Node));
		if(_S == NULL)
			return NULL;
		_Acc :: _Next(_S) = _Next != 0 ? _Next : _S;
		_Acc :: _Prev(_S) = _Prev != 0 ? _Prev : _S;
		return _S;
	}

	_Nodeptr _Head;
	size_type _Size;
};


这段代码主要由三部分构成,第一个是结构体_Node,这是构成链表的重要元素,相信这个不用说,第二个是_Acc,这个类的功能就是返回结点的下一个结点,前一个结点,和当前结点的值,最后一个重要的部分就是_Buynode函数,这个函数的功能就是创建一个结点。我们下来会比较详细的对这三个部分进行说明。

   1.结点_Node  要创建一个链表,肯定要先有一个结点,链表是由结点构成的,每个结点有三个部分,分别是它的前驱,后继,和值,这和我们平时数据结构里面链表的实现没有任何区别。

   2._Acc类,很多人看了这个类,可能会很困惑,为什么要有这个类,这个类的功能就是指定一个结点返回它的前驱,侯继,和值,这些功能上面的_Node结构体完全可以实现阿,你有这些困惑,完全时很正常的,其实,我也很纳闷,这样写代码,确实可以提高美观,但是,难道就仅仅是这个功能吗,这可能就是大牛之间的高明之处吧,不过,如果硬要给个理由的话,我觉得,这可能正体现了一个伟大的设计哲学,就是一段程序只干一件事,大牛们,可能觉得结点结构体的功能就是创建结点,这种操作还是应该交给一个具体的函数来做。

      接下来,大家可以看到,_Acc类的每一个成员函数都是static类型的,这是因为我们不需要创建一个_Acc类的对象,就可以调用它的方法。至于函数体里面的内容很简单,就是完成自己相应的功能,然后,返回一个结点指针引用,之所以返回引用,是因为这个结点指针被返回回去,它的值是可以被我们进行修改的。

   3._Buynode函数,顾名思义,这个函数的功能就是买一个结点,即就是创建一个你自定义的结点,这个函数有两个参数,一个是你要创建结点的前驱结点,一个是后继结点,里面的实现很有意思,是一个三元表达式,只要大家仔细看,相信大家肯定可以看懂,这个函数的功能相当于是,你可以创建一个结点,这个结点的前驱和后继指针都是你自己可以自定义的,如果你不提供定义,这个函数则默认创建一个前驱和后继都指向自己的结点。

 这三个部分明白之后,这段代码也就不是多难了。另外,给大家提供一个主函数来测试自己的代码是否达到了功能,可以用debug来查看自己创建的链表是否成功。

#include "list.h"

int main()
{
	list<int> my_list;
	return 0;
}


手把手教你用VM实现欧姆龙PLC数据采集(含Fins协议配置详解) 本文详细介绍了如何使用VM(VisionMaster)实现与欧姆龙PLC的数据采集,重点解析了Fins协议(包括Fins TCP/UDP)的配置步骤。从网络环境搭建、PLC的IP地址设置,到VM端Fins通讯通道的详细配置与数据点映射,提供了完整的实战指南。文章还涵盖了数据收发解析、常见问题排查清单,帮助工程师快速完成视觉系统与PLC的稳定集成。 阅读详情

相关推荐

FlinkCDC数据同步Bug——同步性能由于写入并行度限制无法提升问题的解决

使用FlinkCDC进行数据同步时,出现增量阶段写入并行度强制为1导致整体同步性能无法提升问题的解决方案

csdn_lan的博客 2080

stl_list.h源码剖析

容器list双向环形链表 list相较于vector的连续线性空间,list显得复杂许多,好处是每次插入或者删除一个元素,就配置或释放一个元素空间。因此list对于空间的运用绝对精准,一点也不浪费。而且对于任何位置的元素插入和元素移除,list永远是常数时间<STL源码剖析> 相关图 节点设计 template <class T> struct __list_node { typedef void* void_pointer;//缺陷,使用时都得强转成_list_node类型

asladfa的博客 353

Frida提取Cocos游戏XXTEA密钥的实战方法论

XXTEA是一种轻量级分组加密算法,广泛用于移动端游戏通信保护;其128位密钥的安全性直接决定网络协议逆向成败。在Cocos引擎生态中,密钥常以静态常量、JNI动态传递或Native运行时派生三种形态存在,导致传统静态分析失效。Frida凭借跨Java/Native注入能力与内存实时观测优势,成为捕获密钥‘出生瞬间’的关键工具——尤其适用于hook xxtea_encrypt函数入口、监控JNI参数传递、设置内存断点追踪派生过程等场景。本文聚焦Cocos2d-x与Cocos Creator项目,覆盖从密钥识

weixin_33509600的博客 419

list.h库文件的分析与运用

 lish.h定义双向循环链表的的相关操作。具体的源码分析网上有很多,而且你自己通过阅读注释也可以看懂每个函数的具体功能。接下来就是list.h文件的运用: 由于list.h属于内核模块中的库文件(usr\src\linux-headers-version\include\linux\ 而默认加载的是usr\include\下的库文件,不包含list.h 因此需要自己写一个库文件其中包含li...

做互联网行业中的顶梁柱,认真学习,虚心求教 345

超详细版!Obsidian+Claude+Skills+云同步,打造智能 AI 知识库

本文介绍如何搭建高效的AI知识管理系统,将Obsidian笔记工具与ClaudeAI助手深度整合。通过ClaudeCode安装配置、ObsidianSkills插件添加和坚果云同步设置,实现本地存储安全性与云端便捷性的完美结合。该系统支持智能笔记整理、知识图谱可视化、智能搜索问答和内容创作辅助等功能,使静态笔记转变为能自动分析关联、处理复杂结构的"活"知识库。详细步骤包括工具准备、环境配置、插件安装和云同步设置

2301_79998006的博客 1083

告别‘小目标’丢失!手把手复现DNANet红外检测网络(PyTorch版)

本文详细介绍了如何使用PyTorch从零实现DNANet红外小目标检测网络,重点解析了DNIM模块和CSAM注意力机制的设计与实现。通过实战教程,帮助开发者解决红外小目标检测中的特征提取和训练调参难题,适用于军事侦察、安防监控等场景。

weixin_28701593的博客 253

STL学习_stl_list.h_源码分析

stl_list.h中有几个函数自己觉得比较重要,transfer()  merge()  sort() #ifndef _SGI_STL_INTERNAL_LIST_H #define _SGI_STL_INTERNAL_LIST_H //list迭代器结构 //不同的容器往往要给容器设置符合自己的迭代器,list的迭代器类型是双向迭代器 //list的迭代器必须有能力进行递增

xixihaha331的博客 782

ABAQUS二次开发中创建SET

在ABAQUS中创建加载、边界条件时,需要使用set,创建set时需要使用对象集合对象中的Set函数,这个函数需要提供加入对象集合的列表,但这个对象列表好像并不能自行创建,只能通过ABAQUS各类对象集合中的findAt、getSequenceFromMask、getByBoundingSphere、getByBoundingCylinder或getByBoundingSphere函数得到,但这几个函数在直接使用PYTHON编程时都不太好用。这个函数返回一个字典,如下所示。

hohoyu的专栏 2484

stl中的运算子

今天终于明白了下面这些的区别: Adaptor and conversion functions Negators not1 Return negation of unary function object (function template ) not2 Return negation of binary function object (functio

salutlu的专栏 671

ENS160传感器原理图设计,已量产(空气质量传感器)

ENS160 是一款集成式数字空气质量传感器,核心优势源于 “MEMS 传感元件 + 内置微处理器” 的架构。

不脱发的程序猿 573

ADB加密实例

主要介绍如何给adb命令增加加密访问

四儿家的小祖宗的博客 2912

《STL源码剖析》-- stl_list.h

// Filename: stl_list.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://blog.csdn.net/mdl13412 /* * * Co

一个人的战争 6089

[内网基础] 内网基础知识 —— Windows 工作组

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知的。Windows 为了解决这一问题,就产生了工作组(Work Group)这个概念。Windows 工作组尝试将不通的计算机按功能(或部门)分别列入不同的工作组,例如技术部的计算机都列入 “技术部” 工作组、行政部的计算机都列入 “行政部” 工作组。要想访问某个部门的资源,只要在 “网络” 里双击该部门的工作组名,就可以看到该部门里的所有计算机了。

Blue17 の 小窝 1606

C++ stl库 手写 源码分析

C++ stl库 手写前言序列式关联式容器适配器ListVector 函数dequestringstack queuebitset关联式容器 set multisetmultiset算法库仿函数 前言 stl版本 abcd,四个版本, 接口肯定是一样的 代码复用性强,效率高,通用性高,vector deque 他有六个组件,空间配置器,容器,迭代器,算法,仿函数,容器适配器 容器和算法中间,靠迭代器连接 算法为了通用性,有辅助的东西,让算法通用,也就是使用仿函数 仿函数就是一个对象 容器通过适配器,可以相

hxhxhxhxx的博客 2859

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【C++STL :list类 (二) 】序列容器性能的本质:深度剖析 list 与 vector 的迭代器核心奥秘

1、list和vector其实是互补的关系——2、vector任意位置插入和删除效率低插入时有可能需要增容头插、头删还是用list;3、数组比链表更好;4、单纯存东西:vector(顺序表)更优,有头部操作:list。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1625

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关于STL中List解析

相对于vector的连续性空间,list就显得复杂许多,它的好处每次插入或者删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准。而且,对于任何位置的元素插入或元素的移除,list永远是常熟时间。 list和vector是两个最常被使用的 容器。什么时机下最适合使用哪个容器,必须看元尿素的多寡,元素的构造复杂度等关于他们的比较我们看下以下的叙述: list是双向链表

Csoul89757 626

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【STL源码拆解】基于源码分析forward_lsit容器实现(详细!)

本篇文章介绍一下c++11中新增的顺序容器forward_list,基于stl的源码分析一下该容器的整体实现及数据结构。 说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。 按照惯例,还是先看一下本文大纲,如下: 1. forward_list是什么 forward_list是c++11为STL新增加的一种顺序容器,使用的时候包含头文件forward_list即可,真实的类声明位于头文件bits/forward_list.h中,类forward_list是一个类模板,基于单链表结构

cpp加油站的专栏 523

STL源码分析 queue容器

源代码来自sgi-2.91版本stl_queue.h 文章目录queue总述queue类运算符重载 queue总述 先了解deque容器->deque (1)因为deque容器双向push和pop的特性,所以queue的底层实现可以完全由deque代替,所以queue与其叫容器,不如叫deque的适配器。 (2)不带iterator,不能遍历 (3)底层实现不一定要deque,vector也可以,因为满足尾部push、pop特性 queue类 #ifndef __STL_LIMITED_DEFAULT

qq_24447809的博客 223

STL源码剖析-List

List概述 List的好处是每次插入或删除一个元素,就配置或释放一个元素空间,因此,List对于空间的运用有绝对的精准,一点也不浪费。并且,对于任何位置的元素插入或移除,llist永远是常数时间。 List的节点 list本身和list的节点是不同的结构,list本身应该是整一张表,而一张表有很多个节点,以下是list的节点的结构: template<typename T> ...

weixin_37549298的博客 392

STL源码分析(未完待续7/04)

文章目录1.STL六大组件介绍1)简介2)文件分类3)头文件包含关系a) 空间配置器(allocator)b) 容器(container)c) 算法(algorithm)d) 迭代器(iterator)2.源码剖析1)迭代器a) 迭代器失效2)容器a) vector底层源码讲解(1)图解(2)几点注解(3)vector容器函数讲解a) 构造函数和析构函数b)属性获取:begin\end\size\capacity\emptyc ) push 和 pop 操作d ) erase 删除元素e ) insert

谢白羽 471

C++ STL容器源码—forward_list

【侯捷-SL体系结构内核分析-forward_list探索】 以forward_list为例,分析源码框架。 容器类成员变量包装类 _XX_val 其中,变量 _Myhead就是forward_list的头指针。 容器类继承关系 _Flist_alloc类 容器allocator的基类,其中含有数据成员_Flist_val。 2. _Flist_buy类 继承自_Flist_alloc类 ...

ZLP_优快云的博客 440

C++ STL源码刨析 list篇(1)容器建立

新手对STL容器的源码剖析。 首先为什么要做源码刨析?甚至我也有很大的疑问,会用就好。但是事实上看了源码会让你对各个算法的运用和容器有了更深的认识,并且我们阅读大师级的源码不也是一个成长的过程吗。 提示: 命名方式: _Insert_after 当下划线出现在首部时,变量作为函数内部使用。 首先工具推荐使用VS2017以上的版本。 接下来我们一步步的实现list。 首先list是个双向的链表 1.定义list.h 知识点: explicit关键字 explicit关键...

qq_60567866的博客 982

STL学习整理(二)

list list为例子,看迭代器和空间配置器 迭代器 实现指针类似的功能。 空间配置器 空间申请、释放。 对象的构造、析构,以及适用不同的数据类型、不同的容器。 迭代器的分类: 输入迭代器、输出迭代器、双向迭代器、前向迭代器、随机迭代器。vector的迭代器是随机的,list的迭代器是双向的,单向链表,不应该提供–操作 ...

王学门徒 206

动手实现自己的 STL 容器《2》---- list

1. 序:    本文参考了侯捷的 《STL 源码分析》一书,出于兴趣,自行实现了简单的 list 容器。    学习了 STL 的 list 容器的源代码,确实能够提高写链表代码的能力。其中的 sort 函数,可谓是非常神奇。。。 2. 实现的细节    STL 的 list 容器采用了一个带有尾节点的环状双向链表。 如下图所示: // Last Update:2014

L.J.SHOU的专栏 1399

STL源码剖析

STL源码剖析——空间配置器 STL源码剖析——Traits编程技术 STL源码剖析——迭代器 STL源码剖析——全局函数 STL源码剖析——序列容器之vector STL源码剖析——list容器的排序算法sort() STL源码剖析——序列容器之list STL源码剖析——序列容器之deque STL源码剖析——容器配接器之stack STL源码剖析——容器配接器之queue STL源码剖析——...

zzxiaozhao的博客 477

【STL和泛型编程-侯捷】---学习笔记(上)

1 STL体系结构基础介绍 1 第一讲 (1)Generic Programming(GP,泛型编程),使用template模板为主要工具来编写程序。 (2)STL是泛型编程GP最成功的作品。1.1 C++ Standard Library VS Standard Template Library (1)C++标准库(C++ Standard Library),include的头文件,标准库中70%都是STL;C++标准库.h文件,编译器自带,可以看到源代码。 (2)Standrad Templat...

plain_rookie的博客 2614
上一篇: [20160821]指针(3)
下一篇: c++单链表实现大数的求和运算
Findway_
博客等级 码龄10年 36粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值