简易实现 STL--list

news2024/9/20 22:54:13

实现 list 的主要思想及过程

首先,实现过程中的所有代码必须放在自己定义的命名空间中。

定义一个结点的结构体类模板,结点的数据类型就应该是模板类型 T,定义的 next指针和 prev指针都应该是模板指针类型,并且结构体类中药有构造函数,确保在 new 结点的时候,不会出现未初始化的情况。

第二步就是定义一个迭代器的类模板,其中模板参数要有三个,分别做数据类型和返回值类型,保证普通迭代器和 const 类型的迭代器都能通用,在泛型编程下,只要保证模板参数的数量足够,编译器就能自动推导需要的数据类型!

最后一步就是写出 list 的类模板,这个其实只需要传一个模板参数即可,在使用迭代器的时候,使用迭代器自己实例化的模板参数来自动推导即可。

因为list 在使用迭代器的时候只需要控制普通迭代器和 const 迭代器的返回类型即可,所以只需要两种不同模板参数的迭代器区分返回值即可。

#include<iostream>
using namespace std;
namespace zyb
{
	template<class T>
	struct list_node
	{
		T _val;
		list_node<T>* _next;
		list_node<T>* _prev;

		list_node(const T& x = T())
			:_val(x),
			_next(nullptr),
			_prev(nullptr)
		{}
	};
	template<class T,class Ref,class Ptr>
	struct __list_iterator
	{
		typedef list_node<T> Node;
		typedef __list_iterator<T, Ref, Ptr> self;
		Node* _node;
		__list_iterator(Node* node)
			:_node(node)
		{
		}
		self operator++(int)
		{
			self tmp = __list_iterator(_node);
			_node = _node->_next;
			return tmp;
		}
		self operator--(int)
		{
			self tmp = __list_iterator(_node);
			_node = _node->_prev;
			return tmp;
		}
		self& operator++()
		{
			_node = _node->_next;
			return *this;
		}
		self& operator--()
		{
			_node = _node->_prev;
			return *this;
		}
		bool operator==(const self& it)
		{
			return it._node == _node;
		}
		bool operator!=(const self& it)
		{
			return it._node != _node;
		}
		Ref operator*()
		{
			return _node->_val;
		}
		Ptr operator->()
		{
			return &(_node->_val);
		}
	}; 
}

泛型编程中模板的再理解 

过程中学习到的一些模板的知识:如何自己实现一个函数,可以打印不同容器中不同的数据类型?

这是实现 list 的不同数据打印的代码,值得注意的是,在 list<T> 前面加了一个 typename  ,包括前面的模板声明,也用的是 typename 这是为什么呢?

如果不加 typename ,因为 list<T>  就是未实例化的模板,因为类型是不确定的,里面会有好多未确认的类型,并且编译器无法辨别 const_iterator 是 内嵌类型 还是 静态成员变量(只有内嵌类型和静态成员变量才能通过类域去访问),编译器就会报错那么前面加一个 typename,就相当于一个给编译器的声明,这是一个内嵌类型(保证编译的时候不会报错),等 list<T> 实例化之后,再去对应的类里找到实例化类型来替换。

template<typename T>
	void print_list(const list<T>& lt)
	{
		typename list<T>::const_iterator it1 = lt.begin();
		while (it1 != lt.end())
		{
			cout << *it1 << ' ';
			++it1;
		}
		cout << endl;
		for (auto e : lt)
		{
			cout << e << ' ';
		}
	}

当然,也可以改写为一个针对全部容器打印数据的代码,

Container 的类型根据传入的容器类型来推导出来,相当于对于上面的模板再抽象了一层。

这就是泛型编程!

	template<typename Container>
	void print_container(const Container& x)
	{
		typename Container::const_iterator it1 = x.begin();
		while (it1 != x.end())
		{
			cout << *it1 << ' ';
			++it1;
		}
		cout << endl;
		for (auto e : x)
		{
			cout << e << ' ';
		}
	}

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

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

相关文章

git的使用思维导图

源文件在github主页&#xff1a;study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)

力扣:77. 组合(回溯, path[:]的作用)

题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&…

MS5541/MS5542,高精度DAC,2.7V 到 5.5V、串行输入、电压输出、16 位数模转换器,可替代AD5541

MS5541/MS5542 是一款单通道、 16 位、串行输入、电压 输出的数模转换器&#xff0c;采用 2.7V 至 5.5V 单电源供电&#xff0c;输出范围 为 0V 至 V REF 。在输出范围内保证单调性&#xff0c;在温度范围为 -40 C 至 85 C 能够提供 1LSB INL 的 14 位精度。…

pycharm git 版本回退

参考 https://blog.csdn.net/qq_38175912/article/details/102860195 yoyoketang 悠悠课堂

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来&#xff0c;物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环&#xff0c;PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网&#xff0c;实现工厂设备数据采集”这一主题&#xff0c;探讨PLC物联网…

合并一个excel文件中的多个sheet

import pandas as pd #要合并的文件路径 filepath/Users/kangyongqing/Documents/kangyq/202311/班均及合班储备/最后校验/二批次组班/ file1z小班合班方案_2012&#xff08;1&#xff09;.xlsx #获取文件d的所有sheet名 df1pd.read_excel(filepathfile1,sheet_nameNone,engine…

Graylog配置日志保留策略

找了半天没找到说的清楚的&#xff0c;只能抠官方文档 graylog的归档&#xff08;日志持久化&#xff09;只有付费版才能用&#xff0c;所以日志只能存在es中 1.理解官方给出的几个概念 轮转策略 (Index Rotation Strategy): 轮转策略定义了何时创建新的索引以及何时关闭旧的索…

C语言-> 文件操作(函数满屏)

系列文章目录 前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青_C语言,数据结构,函数-CSDN博客 目的&#xff1a;学习文件操作&#xff0c;即…

gitee的学习

1.git下载 下载地址&#xff1a;https://git-scm.com/ 2.建立远程仓库 访问&#xff1a;gitee.com 在此网站上创建 3.本地操作 在本地找一个任意文件&#xff0c;克隆git 执行命令&#xff1a;git clone https://gitee.com/beijing-jiaxin-times_0/test_zsx_cang_ku.git …

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现&#xff0c;并在第 2 部分中探索训练过程之后&#xff0c;我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码&#xff0c;请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

[c]用指针进行四个数排序

#include<stdio.h> void swap(int*p1,int*p2)//定义函数&#xff0c;实现两个数值交换 {int temp;temp*p1;*p1*p2;*p2temp; } void psort( int *pa, int *pb,int *pc,int *pd) {int i1;for(i1;i<3;i)//对四个数排序&#xff0c;至少3次循环&#xff0c;交换过后是升序…

海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

漏洞介绍 海康威视IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞&#xff0c;该漏洞源于文件/ph…

跨境电商独立站有哪些优势,要如何做?

跨境电商独立站是指面向海外市场的电商网站&#xff0c;具有以下优势&#xff1a; 自主品牌 搭建跨境电商独立站可以通过自主品牌的打造&#xff0c;提升品牌的知名度和影响力&#xff0c;同时也可以在海外市场建立起更加稳定的品牌形象。 自主掌控 跨境电商独立站可以自主掌…

Python算法例19 创建最大数

1. 问题描述 给定两个长度分别是m和n的数组&#xff0c;数组的每个元素都是数字0~9&#xff0c;从这两个数组当中选出k个数字来创建一个最大数&#xff0c;其中k满足k&#xff1c;mn&#xff0c;选出来的数字在创建最大数里的位置必须与在原数组内的相对位置一致。返回k个元素…

Java第一个程序——Hello,World!

“Hello, world”的由来可以追溯到 The C Programming Language 。在这门编程语言中&#xff0c;它被用作第一个演示程序&#xff0c;向人们展示了在计算机屏幕上输出“Hello world”这行字符串的计算机程序。由于这个演示程序的简洁性和直观性&#xff0c;它成为了许多初学者学…

韩语中的一次多用-柯桥基础韩语学习

1.动词&#xff0c;写 일기를 쓰다 写日记 2.动词&#xff0c;戴&#xff08;帽子&#xff0c;眼镜&#xff0c;口罩&#xff09; 안경을 쓰다 戴眼镜 3.动词&#xff0c;使用&#xff08;材料&#xff0c;道具&#xff0c;手段&#xff09; 세제를 쓰다 使用洗剂 4.动词&am…

Java对接腾讯多人音视频房间回调接口示例

在前面我们已经对接好了腾讯多人音视频房间相关内容&#xff1a;Java对接腾讯多人音视频房间示例 为了完善业务逻辑&#xff0c;我们还需要对接它的一些回调接口 官方文档地址 主要就下面这些 这里因为比较简单直接上代码 里面有些工具类和上一章一样这里就没贴&#xff0c;需要…

机器学习 | 集成学习

团结就是力量&#xff01; Ensemble Learning 兼听则明&#xff0c;偏信则暗。 集成学习既是一种思想也是一类算法&#xff0c;它是建立在其他机器学习的算法之上&#xff0c;研究怎么让不同的算法之间进行协同。 既可以监督学习&#xff0c;也可以无监督学习。 集成学习用机器…

Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!

Gemini 1.0&#xff1a;Google推出的全新AI模型&#xff0c;将改变生成式人工智能领域的游戏规则&#xff01; &#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 …

C/C++与MySQL:多线程、大并发和异步操作的实践

C/C与MySQL&#xff1a;多线程、大并发和异步操作的实践 在前面的文章中&#xff0c;我们介绍了如何使用C/C调用MYSQL API进行基本的数据库操作。然而&#xff0c;在实际应用中&#xff0c;特别是面对大量用户请求和高并发场景时&#xff0c;单线程的数据库操作往往显得力不从…