STL_List与萃取

List

参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243

List源码

在这里插入图片描述

List中节点的定义:
list是双向列表,所以其中节点需要包含指向前一节点和后一节点的指针, data是节点中存储的数据类型

template <class _Tp>
struct _List_node {typedef void* _Void_pointer;_Void_pointer _M_next;_Void_pointer _M_prev;_Tp _M_data;
};

List列表的定义

template<class T,class Alloc=alloc>
class list
{
protected:typedef __list_node<T> list_node;
public:typedef list_node* link_type;typedef __list_iterator<T,T&,T*>iterator;
protected:link_type node;
...
}

list(双向链表),在GNU2.9源码中,list类中维护了node这个属性,这个属性就是一个包含两个指针prev、next和当前data的结构体。基于容器都要满足前闭后开的原则,在list的头部会添加一个灰部地带,begin()获得灰部地带下一个节点,end()获得灰部地带。

在这里插入图片描述

List迭代器

list_iterator其中定义了5种参数,这五种参数是为了Iterator traits做准备
在STL的算法中,需要传入容器的迭代器,然后根据推断判断出迭代器的类型。

  • bidirectional_iterator_tag :指明迭代器类别,双向列表指针迭代器、单向列表指针迭代器、任意方向链表指针迭代器
  • T(value_type):迭代器指向的数据类型
  • ptrdiff_t(difference_type) 两个迭代器之间的距离,用什么type表现
  • ptr(pointer) 后两个,在此版本中没有使用
  • Ref(reference)

迭代器源码

// __list_iterator源码
template<class T,class Ref,class Ptr>
struct __list_iterator
{typedef __list_iterator<T,Ref,Ptr> self;typedef bidirectional_iterator_tag iterator_category;typedef T value_type;typedef Ptr pointer;typedef Ref reference;typedef __list_node<T>* link_type;typedef ptrdiff_t difference_type;link_type node;reference operator*()const{return *(node).data;}pointer operator->()const{return &(operator*());}self& operator++(){node = (link_type)(*node).next;return *this;}self operator++(int){self temp = *this;++*this;return temp;}...
};

迭代器萃取机Iterator traits

template<typename _ForwardIterator>
inline void rotate(_ForwardIterator __first,_ForwardIterator __middle,_ForwardIterator __last){...std::__rotate(__first,__middle,__last,std::__iterator_category(__first));
}template<typename _Iter>
inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&){return typename iterator_traits<_Iter>::iterator_category();
}

迭代器是算法和容器的桥梁
算法执行,需要获取迭代器包含的5种类型的参数
如上述所示为算法rotate的部分代码,可知算法内部还需要做Iterator类型获取操作
在这里插入图片描述

​同时为了考虑兼容性的问题,就在迭代器和算法之间加了一中间层"萃取机"(traits),同时也是为了用它来辨别iteratorclass类型还是non-class(指针)类型

那么问题来了,traits是如何分辨class和non-class类型的iterator呢?答案是partial specialization(模板的偏特化)。

// iterator为class类型,直接取默认泛型
template<class I>
struct iterator_traits {typedef typename I::iterator_category 	iterator_category;typedef typename I::value_type 			value_type;typedef typename I::difference_type 	difference_type;typedef typename I::pointer 			pointer;typedef typename I::reference 			reference;
};// iterator为指针
template<class T>
struct iterator_traits<T *> {typedef random_access_iterator_tag 		iterator_category;typedef T 								value_type;typedef ptrdiff_t 						difference_type;typedef T*								pointer;typedef T&								reference;
};// iterator为常量指针
template<class T>
struct iterator_traits<const T *> {typedef random_access_iterator_tag 		iterator_category;typedef T 								value_type;	typedef ptrdiff_t 						difference_type;typedef const T*						pointer;typedef const T&						reference;
};

​ 其中value_type的主要目的是用来声明变量,而声名一个无法被赋值的变量没什么用,所以iterator(即使是const iterator)的value_type不应加上const

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京车展“第一枪”:长安汽车发布全球首款量产可变新汽车

4月25日&#xff0c;万众瞩目的2024北京国际汽车展览会在中国国际展览中心如期而至。作为中国乃至全球汽车行业的盛宴&#xff0c;本次车展也吸引了无数业内人士的高度关注。 此次北京车展以“新时代 新汽车”为主题&#xff0c;汇聚了1500余家主流车企及零部件制造商&#xff…

【R语言】对EXCEL多行或多列数据合并成一行或一列

对于很多行或很多列数据合并成一行或一列数据&#xff0c;手动是非常麻烦的&#xff0c;尤其当行列数无穷大&#xff0c;根本无法手动处理&#xff0c;在这里价绍一种解决办法&#xff1a;运行R语言&#xff0c;对数据的快速合并。 这里一多列合并成一列为例&#xff08;如果是…

Linux基本指令(2)

目录 mv指令&#xff1a; cat&#xff1a; more指令&#xff1a; less指令&#xff1a; head指令&#xff1a; tail指令&#xff1a; mv指令&#xff1a; 说明&#xff1a; mv命令是move的缩写&#xff0c;可以用来移动文件或者文件改名(move(rename)files),是linux系统下…

20240428-并发编程特性-原子性(二)

使用synchronized锁 package com.ysf;public class Tst02AtomicSync {private static int count 0;public static void increment() {synchronized (Tst02AtomicSync.class) {count;}try {Thread.sleep(10L);} catch (InterruptedException e) {e.printStackTrace();}}public…

(二十一)C++自制植物大战僵尸游戏僵尸游戏关卡结束数据处理

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs 文件位置 代码实现的文件在Class\Scenes\GameScene文件夹中,如下图所示。 GameEndLayer.h class GSGameEndLayer :public LayerColor { public:CREATE_FUNC(GSGameEndLayer);void successfullEntry();void brea…

必应bing广告推广开户时间需要多久?

企业选择合适的平台进行广告投放成为了企业获取竞争优势的关键一步&#xff0c;必应Bing作为全球第二大搜索引擎&#xff0c;凭借其庞大的用户基础和精准的广告定位能力&#xff0c;成为了众多企业海外及国内市场推广的优选渠道。云衔科技以专业、高效的服务&#xff0c;成为企…

MacOS - 打开 App 无法验证开发者解决方案

一、设置安全性与隐私偏好设置 1、点击苹果菜单图标&#xff0c;选择系统偏好设置。 2、点击安全性与隐私。 3、在通用选项卡中&#xff0c;确保已启用允许从以下位置下载的应用程序选项&#xff0c;并选择任何来源。 4、如果已经选中任何来源&#xff0c;则尝试切换到App …

JVM合集【持续更新】

Java虚拟机&#xff08;JVM&#xff09;&#xff1a; 是Java程序运行的环境&#xff0c;它负责解释执行 Java 字节码&#xff08;Bytecode&#xff09;&#xff0c;并提供了内存管理、垃圾回收等功能。JVM 是 Java 程序在不同平台上实现跨平台的关键。JVM 可以独立于 JDK 存在&…

【QEMU系统分析之启动篇(十一)】

系列文章目录 第十一章 QEMU系统仿真的加速器初始化分析 文章目录 系列文章目录第十一章 QEMU系统仿真的加速器初始化分析 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的启动分析1.系统仿真的初始化代码2.主循环数据初始化configure_accelerators()phase_advance(PHASE_A…

科技感十足特效源码

源码介绍 科技感十足特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码截图 源码下载 科技感十足特效源码

Linux:冯诺依曼体系结构、操作系统、初识进程

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数&#xff08;lib&#xff09;概念 总结 3.初识进程3.1 基本事实与引入3.2…

外贸常用邮件模板-客户投诉要如何处理?

外贸业务人员在与国外客户长期合作的过程当中&#xff0c;很难完全避免所有业务环节都万无一失&#xff0c;在整个订单的开发执行和成交售后过程当中&#xff0c;一旦出现某些问题导致客户投诉&#xff0c;将会在很大程度上影响我们和客户之间的关系以及未来的长期合作。 因此…

如何编写一个高性能的Web服务器

编写一个高性能的Web服务器需要考虑多个方面&#xff0c;包括架构设计、并发处理、资源优化、安全性等。以下是一些关键步骤和策略&#xff0c;帮助你编写一个高性能的Web服务器&#xff1a; 选择合适的编程语言和技术栈&#xff1a; 选择一个适合Web开发的编程语言&#xff0c…

ZYNQ之嵌入式开发05——串口中断、定时器中断、QSPI和SD卡读写测试实验

文章目录 UART串口中断实验定时器中断实验PS-XADC实验QSPI Flash读写测试SD卡读写文本文档 UART串口中断实验 UART控制器是一个全双工异步收发器&#xff0c;支持可编程的波特率和IO信号格式&#xff0c;具有独立的TX和RX数据路径&#xff0c;每个路径有一个64字节的FIFO&…

设计模式学习笔记 - 开源实战五(中):如何利用职责链与代理模式实现Mybatis Plugin

概述 上篇文章对 Mybatis 框架做了简单的背景介绍&#xff0c;并通过对比各种 ORM 框架&#xff0c;学习了代码的易用性、性能、灵活性之间的关系。一般来讲&#xff0c;框架提供的高级功能越多&#xff0c;那性能损耗就越大&#xff1b;框架使用起来越简单&#xff0c;那灵活…

59岁郑浩南罕见与索爆女儿合体,曾自曝婚变暗示妻子出轨人财两空

59岁的郑浩南&#xff0c;拍过不少脍炙人口的电影&#xff0c;尤其是在《古惑仔》中饰演奸角司徒浩南&#xff0c;近作有《黑社会》的「加钱哥」&#xff0c;虽然将近「登六」&#xff0c;却保养得宣&#xff0c;操出一身健硕肌肉。 跟前妻鲍爱玲离婚后&#xff0c;郑浩南独自在…

即插即用Mamba模块全新突破!无缝集成,无痛涨点

Mamba入局图像复原了&#xff01;基于Mamba的图像复原基准模型MambaIR性能超越SwinIR&#xff0c;达成新SOTA&#xff01; MambaIR是一种引入通道注意力和局部增强的即插即用Mamba模块。这类高效、创新的模块在写论文时可以帮助我们简化模型的构建过程&#xff0c;通过将这些模…

Android 11 bindService 流程分析

我们可以使用bindService来跨进程通信&#xff0c;其使用方法如下 Intent intent new Intent("xxx"); intent.setPackage("xxx"); boolean result bindService(intent,new ServiceConn(),BIND_AUTO_CREATE);private class ServiceConn implements Servi…

使用lua时一个愚蠢的错误

之前看luaL_openlibs()&#xff0c;感觉直接调打开库的函数好像也没差别&#xff0c;所以将 LUALIB_API void luaL_openlibs (lua_State *L) {const luaL_Reg *lib lualibs;for (; lib->func; lib) {lua_pushcfunction(L, lib->func);lua_pushstring(L, lib->name);…

学习100个Unity Shader (15) ---透明+双面渲染

文章目录 效果shader理解参考 效果 shader Shader "Example/AlphaBlendBothSided" {Properties{_Color ("Main Tint", Color) (1, 1, 1, 1)_MainTex ("Texture", 2D) "white" {}_AlphaScale ("Alpha Scale", Range(0, 1)…