C++复习笔记9

news2024/7/31 0:45:07

STL中的list的部分实现,包括了迭代器的整体实现思想和空间配置器的部分功能。

main.cpp

//STL中的list是一个双向循环链表
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include"mymemory.h"
using namespace std;

class String
{
public:
	String(const char* str="")
	{
		this->m_data = new char[strlen(str) + 1];
		strcpy(this->m_data, str);
	}

	String(const String& s)
	{
		this->m_data = new char[strlen(s.m_data) + 1];
		strcpy(this->m_data, s.m_data);
	}

	~String()
	{
		delete[] this->m_data;
	}

private:
	char* m_data;
};

namespace myList
{
	template<class _Ty, class _A=my_alloctor<_Ty>>
	class list
	{
	public:
		//类型的萃取
		typedef size_t size_type;
		typedef _Ty    value_type;
		typedef _Ty*   pointer_type;
		typedef _Ty& reference_type;


		struct _Node;
		typedef _Node* _Nodeptr;
		struct _Node
		{
			_Nodeptr _Next;
			_Nodeptr _Prev;
			_Ty     _Value;
		};
		struct _ACC
		{
			typedef _Node*& _Nodepref;
			typedef _Ty& _Vref;
			static  _Nodepref _Next(_Nodeptr _P)
			{return _P->_Next;}
			static _Nodepref _Prev(_Nodeptr _P)
			{return _P->_Prev;}
			static _Vref _Value(_Nodeptr _P)
			{return _P->_Value;}
		};

		class iterator
		{
	     public:
			 iterator() {}
			 iterator(_Nodeptr P):_Ptr(P){}
			 
			 _Ty& operator*()
			 {
				 return _Ptr->_Value;//返回值而不是返回结点
			 }

			 iterator& operator++()
			 {
				 _Ptr = _Ptr->_Next;
				 return *this;
			 }

			 iterator& operator--()
			 {
				 _Ptr = _Ptr->_Prev;
				 return *this;
			 }

			 bool operator!=(const iterator& it)
			 {
				 return _Ptr != it._Ptr;
			 }

			 bool operator==(const iterator& it)
			 {
				 return _Ptr == it._Ptr;
			 }

			 _Nodeptr _Mynode()
			 {
				 return _Ptr;
			 }

		protected:
			_Nodeptr _Ptr;
		};

		explicit list():_Head(_Buynode()),_Size(0)
		{}

		explicit list(size_type _N, const _Ty& _V = _Ty()):_Head(_Buynode()),_Size(0)
		{
			insert(begin(), _N, _V);
		}

		iterator begin()
		{
			return  iterator(_Head->_Next);
		}

		iterator end()
		{
			return iterator(_Head);//_Head->_Prev->_Next 左闭右开,双向循环链表特殊情况
		}

		iterator insert(iterator _P, const _Ty& _X = _Ty())//_X=_Ty()为零初始化
		{
		/*	_Nodeptr _S = _Buynode(_P.Mynode(), _P.Mynode()->_Prev);
			_S->_Prev->_Next = _S;
			_S->_Next->_Prev = _S;
			_S->_Value = _X;
			++_Size;*/

			_Nodeptr _S = _P._Mynode();
			_ACC::_Prev(_S) = _Buynode(_S, _ACC::_Prev(_S));
			_S = _ACC::_Prev(_S);
			_ACC::_Next(_ACC::_Prev(_S)) = _S;
			//_S->_Value = _X;
			allocator.construct(&_ACC::_Value(_S), _X);
			++_Size;
			return iterator(_S);
		}

		void insert(iterator _P, size_type _M, const _Ty& _X)
		{
			for (; 0 < _M; --_M)
				insert(_P, _X);
		}

		void insert(iterator _P, const _Ty* _F, const _Ty* _L)
		{
			for (; _F != _L; ++_F)
			{
				insert(_P, *_F);
			}	
		}

		void push_back(const _Ty& x)
		{

			insert(end(), x);

			//_Nodeptr _S = _Buynode();
			//_S->_Next = _Head;
			//_S->_Prev = _Head->_Prev;
			//_S->_Prev->_Next = _S;
			//_S->_Next->_Prev = _S;

			//_Nodeptr _S = _Buynode(_Head,_ACC::_Prev(_Head));
			_Head->_Prev->_Next = _S;
			//_ACC::_Value(_S) = x;
			//_ACC::_Next(_ACC::_Prev(_Head)) = _S;
			_Head->_Prev = _S;
			//_ACC::_Prev(_Head) = _S;
			//_Size++;
		}

		void push_front(const _Ty& x)
		{
			insert(begin(), x);

		//	_Nodeptr _S =_Buynode(_ACC::_Next(_Head), _Head);
		///*	_ACC::_Prev(_ACC::_Next(_Head)) = _S;
		//	_ACC::_Next(_Head) = _S;*/
		//	_ACC::_Next(_ACC::_Prev(_S)) = _S;//换着方法写,增强理解
		//	_ACC::_Prev(_ACC::_Next(_S)) = _S;
		//	_ACC::_Value(_S) = x;
		//	_Size++;
		}

	/*	void show()const
		{
			_Nodeptr _P = _Head->_Next;
			while (_P != _Head)
			{
				cout << _P->_Value << "-->";
				_P = _P->_Next;
			}
		}*/

	protected:
		_Nodeptr _Buynode(_Nodeptr _Narg=0,_Nodeptr _Parg=0)//后继参数和前驱参数
		{
			//_Node* _S = (_Node*)malloc(sizeof(_Node));
			_Node* _S = (_Nodeptr)allocator.charalloc(sizeof(_Node));
			//_S->_Next = _Narg != 0 ? _Narg : _S;//头结点和普通节点都考虑了,比较巧妙
			_ACC::_Next(_S) = _Narg != 0 ? _Narg : _S;
			//_S->_Prev = _Parg != 0 ? _Parg : _S;
			_ACC::_Prev(_S)= _Parg != 0 ? _Parg : _S;
			return _S;
		}

	private:
		_A  allocator;//空间配置器对象
		_Nodeptr _Head;
		size_type _Size;
	};
}

using namespace myList;
void main()
{
	list<String> mylist;
	String s[] = { "abc","xyz","hjk" };
	mylist.push_back(s[0]);
	mylist.push_back(s[1]);
	mylist.push_back(s[2]);
	system("pause");
}

//using namespace myList;
//void main()
//{
//	list<int> mylist(10,2);
//	for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
//	{
//		cout << *it << "-->";
//	}
//	cout << endl;
//	system("pause");
//}

//using namespace myList;
//void main()
//{
//	list<int> mylist;
//	mylist.push_back(1);
//	mylist.push_back(2);
//	mylist.push_back(3);
//	mylist.push_back(4);
//	mylist.push_front(5);
//	
//	list<int>::iterator it= mylist.begin();
//	/*cout << *it << endl;
//	++it;
//	cout << *it << endl;*/
//
//	while (it != mylist.end())
//	{
//		cout << *it << "-->";
//		++it;
//	}
//	cout << endl;
//
//	5 1 2 3 4
//	list<int>::iterator pos = mylist.begin();
//	++pos;
//	++pos;
//
//	int ar[] = { 20,33,35,56,68,99,12,37 };
//	int n = sizeof(ar) / sizeof(ar[0]);
//
//	mylist.insert(pos,3, 100);
//	mylist.insert(pos, ar, ar + n);
//
//	it = mylist.begin();
//	while (it != mylist.end())
//	{
//		cout << *it << "-->";
//		++it;
//	}
//	system("pause");
//}

mymemory.h

template<class _Ty>
_Ty* _My_Allocate(size_t _N, _Ty*)
{
	if (_N < 0)
		_N = 0;
	return((_Ty*)operator new(_N * sizeof(_Ty)));
}

template<class _T1, class _T2>
void _My_Construct(_T1* _P, const _T2& _V)
{
	  new((void*)_P) _T1(_V);//定位new
	
}

template<class _Ty>
void _Destroy(_Ty* _P)
{
	_P->~_Ty();
}

//空间配置器
template<class _Ty>
class my_alloctor
{
public:
	//申请空间
	_Ty* allocte(size_t _N, const void*)
	{
		return (_My_Allocate(_N, (_Ty*)0));
	}

	//申请字节空间
	char* charalloc(size_t _N)
	{
		return (_My_Allocate(_N, (char*)0));
	}

	//释放空间
	void deallocate(void* _P, size_t)
	{
		operator delete(_P);
	}

	//构造对象
	void construct(_Ty* _P, const _Ty& _V)
	{
		_My_Construct(_P, _V);
	}

	//析构对象
	void destory(_Ty* _P)
	{
		_Destory(_P);
	}
};

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

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

相关文章

Python 数据可视化的 3 大步骤,你知道吗?

Python实现可视化的三个步骤&#xff1a; 确定问题&#xff0c;选择图形转换数据&#xff0c;应用函数参数设置&#xff0c;一目了然 1、首先&#xff0c;要知道我们用哪些库来画图? matplotlib Python中最基本的作图库就是matplotlib&#xff0c;是一个最基础的Python可视…

上海亚商投顾:沪指震荡上行 大消费板块全线走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日震荡反弹&#xff0c;沪指全天低开高走&#xff0c;深成指、创业板指均涨超1%。工程机械板块集体大涨&a…

nodejs学习笔记1.2

1、made \\ 中括号代表可选参数 、、、、 使用path模块处理路径拼接问题 、、、、 将/进行转义/ 、、、、 http模块 web服务器 、、、 创建最基本的web服务器 我表示醉了&#xff0c;之前都没有学到&#xff0c;难怪我学得糊里糊涂 req客户端 res…

00---C++入门

1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 2. 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进…

简单易用的以太网IO控制卡:C#读写测试

今天&#xff0c;正运动小助手给大家分享一下运动控制卡之ECIO系列IO卡的用法&#xff0c;C#语言进行ECI IO卡的开发以及测试多个IO读写的交互速度。 一、ECI0032/ECI0064 IO卡的硬件介绍 1.功能介绍 ECI0032/ECI0064等ECI0系列运动控制卡支持以太网、RS232通讯接口和电脑相…

A-Ops性能火焰图——适用于云原生的全栈持续性能监测工具

对于开发及运维人员来讲&#xff0c;火焰图是一个经典的定位性能问题的方法。利用火焰图可以可视化系统资源(cpu占用、内存占用、调度、IO等)的占用情况&#xff0c;从而帮助技术人员快速定位资源异常使用的代码级根因&#xff0c;或者观察潜在性能劣化趋势&#xff0c;进而优化…

2023最新简历模板免费下载

下面分享5个简历模板网站&#xff0c;免费下载&#xff0c;建议收藏&#xff01; 2023用最漂亮的简历模板&#xff0c;让面试官眼前一亮。 1、菜鸟图库 个人简历模板|WORD文档模板免费下载 - 菜鸟图库 菜鸟图库除了有超多设计类素材之外&#xff0c;还有很多办公类素材&#…

Multimap运用

Multimap概念:Multimap的特点其实就是可以包含有几个重复key的value值&#xff0c;你可以put进多个不同的value&#xff0c;但是key相同&#xff0c;但是又不是让后面的覆盖前面的内容.业务场景:当你需要构造像Map<K,List<V>> 或者Map(K,Set<V>)这样比较复杂…

MongoDB--》基本常用命令使用

目录 数据库操作命令 选择和创建数据库 数据库的删除 集合操作命令 集合的显示创建 集合的隐式创建 集合的删除 文档基本的CRUD&#xff08;增删改查&#xff09; 文档的插入 文档的基本查询 文档的更新 删除文档 数据库操作命令 数据库常用的操作命令如下&#x…

docker基础和使用(一)

Docker 入门篇 文章目录Docker 入门篇一、docker简介1.1、docker说明&#xff1a;1.2、docker镜像说明&#xff1a;1.2.1、UnionFS&#xff08;联合文件系统&#xff09;1.2.2、docker镜像分成的好处1.2.3、docker平台架构图二、docker的常用命令1.1、手册查询1.2、docker启停和…

知识图谱业务落地技术推荐之图数据库汇总

0.图数据库排名 链接:https://db-engines.com/en/ranking/graph+dbms 0.1简要分析(各种图数据库属性) Neo4j(主流) 历史悠久且

备考蓝桥杯【快速排序和归并排序】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

【王道数据结构】第八章 | 排序

目录 8.1. 排序的基本概念 8.2. 插入排序 8.2.1. 直接插入排序 8.2.2. 折半插入排序 8.2.3. 希尔排序 8.3. 交换排序 8.3.1. 冒泡排序 8.3.2. 快速排序 8.4. 选择排序 8.4.1. 简单选择排序 8.4.2. 堆排序 8.5. 归并排序和基数排序 8.5.2. 基数排序 8.1. 排序的基本概念 排…

3-track网络预测蛋白质结构和相互作用

目录引言网络架构发展直接生成蛋白-蛋白复合物DeepMind在最近的CASP14上展示了非常准确的预测。作者探索了融合相关思想的网络架构&#xff0c;并通过对一维序列级、二维距离图级&#xff08;distance map&#xff09;和三维坐标级&#xff08;coordinate&#xff09;的信息依次…

机械设备管理软件如何选择?机械设备管理软件哪家好?

随着信息化技术的进步与智能制造的发展趋势&#xff0c;很多机械设备制造企业也在一直探寻适合自己的数字化管理转型之路&#xff0c;而企业上ERP管理软件又是实现数字化管理的前提&#xff0c;机械设备管理软件对于企业来说就是关键一环。机械设备管理软件如何选择&#xff1f…

IPV4地址的原理和配置

第三章&#xff1a;IP地址的配置 IPv4&#xff08;Internet Protocol Version 4&#xff09;协议族是TCP/IP协议族中最为核心的协议族。它工作在TCP/IP协议栈的网络层&#xff0c;该层与OSI参考模型的网络层相对应。网络层提供了无连接数据传输服务&#xff0c;即网络在发送分…

【GD32F427开发板试用】7. 移植LVGL到GD32F427V

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

TypeScript快速入门———(一)TypeScript 介绍以及初体验

文章目录1. TypeScript 介绍1.1 TypeScript 是什么1.2 TypeScript 为什么要为 JS 添加类型支持&#xff1f;1.3 TypeScript 相比 JS 的优势2. TypeScript 初体验2.1 安装编译 TS 的工具包2.2 编译并运行 TS 代码2.3 简化运行 TS 的步骤1. TypeScript 介绍 1.1 TypeScript 是什…

[python入门㊺] - 异常中的finally

目录 ❤ finally的作用 ❤ try、except、finally的执行顺序是什么 ❤ 案列 finally 中不带return finally中有return ❤ finally的作用 finally内的代码不管有无异常发生&#xff0c;都会执行。具体来说&#xff1a; 无论是否发生了异常&#xff0c;一定会执行 fi…

若依-pro使用

前言 最近开始搞一个项目&#xff0c;使用的框架是若依-pro。新手上路&#xff0c;多多指教。 首先了解一下什么是若依&#xff0c;其实他就是将很多项目共同的代码进行了抽取&#xff0c;方便我们可以快速开发的一个javaweb项目&#xff08;若依是一个项目&#xff0c;一个p…