C++模板实现智能数组类

C++ 深度解析教程(十六)函数模板的概念和意义、深入理解函数模板、类模板的概念和意义、类模板深度剖析、数组类模板、智能指针类模板、单例类模板 C++中有几种交换变量的方法?定义宏代码块 VS 定义函数C++中有没有解决方案集合两种方法的优点?对于Swap函数可以考虑下面的泛型写法Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型。当函数重载遇见函数模板会发生什么?在C++中是否能够将泛型的思想应用于类?类模板特化与重定义有区别吗?函数模板可以特化吗?当需要重载函数模板时,优先考虑使用模板特化;当模板特化无法满足需求,再使用函数重载!...... 阅读详情

这个类的使用非常有限,不能说是真正的智能数组

对于一般的数据类型还可以,比如int /float/char等

但是,string类这样的类类型好像不是很好

但是一些基础的东西却是学习的重点

头文件MyArray.h:

#pragma once
#include <iostream>
using namespace std;
template<class T,int N=5>//定义一个类似数组的模板类(智能数组)
class CMyArray
{
public:
	CMyArray(const T& v);
	~CMyArray(void);
	void Show()const;
	int GetLength()const;//获取对象当前元素数目
	int GetTotalSize()const;//获取对象当前申请的总内存
	void ShowSize()const;//显示当前对象的元素个数和总内存数
	T RemoveAt(const int& index);//删除指定位置的元素(索引从0开始),返回删除的元素
	bool RemoveAll();//删除所有元素
	bool IsEmpty()const;//判断当前容器是否为空
	T& operator [](int i);
	void Pop(const T& t);//尾部加入一个元素
	T Push();//尾部删除一个元素,返回该元素
	friend ostream& operator<<(ostream& os,const CMyArray& a)
	{
		a.Show();
		return os;
	}
private:
	T* temp;
	int m_nTotalSize;//当前的总内存数目
	int m_nValideSize;//当前的实际元素个数
};
template<class T,int N>
CMyArray<T,N>::CMyArray(const T& v):temp(NULL)
{
	temp=new T[N];
	m_nTotalSize=m_nValideSize=N;
	for(int i=0;i<N;i++)
		temp[i]=v;
}
template<class T,int N>
CMyArray<T,N>::~CMyArray(void)
{
	if(temp!=NULL)
	{

		delete[] temp;
		temp=NULL;
	}
}
template<class T,int N>
void CMyArray<T,N>::Show()const
{
	if(m_nValideSize==0)
	{
		cout<<"当前对象为空,无法输出"<<endl;
		return;
	}
	cout<<"依次输出当前"<<m_nValideSize<<"个元素"<<endl;
	for(int i=0;i<m_nValideSize;i++)
    	cout<<temp[i]<<"   ";
	cout<<endl;
}
template<class T,int N>
T& CMyArray<T,N>::operator [](int i)
{
	if(i<0||i>N-1)
	{
		cout<<"数组越界,返回第一个元素"<<endl;
		i=0;
	}
	return temp[i];
}
template<class T,int N>
int CMyArray<T,N>::GetLength()const
{
	return m_nValideSize;

}
template<class T,int N>
void CMyArray<T,N>::Pop(const T& t)
{
	if(m_nValideSize<m_nTotalSize)//还有空闲内存
	{
		temp[m_nValideSize]=t;
		m_nValideSize++;
	}
	else//内存用完,继续申请
	{
		//先保存当前数据到临时指针中
		T* data=new T[m_nTotalSize];
		for(int i=0;i<m_nTotalSize;i++)
		{
			data[i]=temp[i];
		}
		delete[] temp;//释放内存
		temp=NULL;//避免产生野指针
		m_nTotalSize*=2;//扩容一倍
		temp=new T[m_nTotalSize];
		for(int i=0;i<m_nValideSize;i++)
		{
			temp[i]=data[i];//复制数据到原始指针中
		}
		delete[] data;//释放内存
		data=NULL;
		temp[m_nValideSize]=t;
		m_nValideSize++;

	}
}
template<class T,int N>
int CMyArray<T,N>::GetTotalSize()const
{
	return m_nTotalSize;
}
template<class T,int N>
T CMyArray<T,N>::Push()
{
	T t;
	if(m_nValideSize==0)
	{
		cout<<"容器已空!"<<endl;
		t=(T)NULL;
		return t;
	}
	t=temp[m_nValideSize];
	m_nValideSize--;
	if((m_nValideSize%N)==0)//刚好多出一个元素,为了节省内存,释放掉一个N的内存
	{
		T* data=new T[m_nValideSize];
		for(int i=0;i<m_nValideSize;i++)
			data[i]=temp[i];
		delete[] temp;//释放内存
		temp=NULL;
		temp=new T[m_nValideSize];//申请内存
		m_nTotalSize=m_nValideSize;
		for(int i=0;i<m_nValideSize;i++)
			temp[i]=data[i];
		delete[] data;
		data=NULL;
	}
	return t;
}
template<class T,int N>
void CMyArray<T,N>::ShowSize()const
{

	cout<<"当前对象中元素数目为:"<<m_nValideSize<<endl;
	cout<<"总内存为:"<<m_nTotalSize<<endl;
}
template<class T,int N>
T CMyArray<T,N>::RemoveAt(const int& index)
{
	if(m_nValideSize==0)
	{
		cout<<"容器已经为空"<<endl;
		return (T)NULL;
	}
	if(index<0||index>m_nValideSize-1)//数组越界
	{
		cout<<"数组越界,无法完成删除操作"<<endl;
		return (T)NULL;
	}
	T ret=temp[index];
	m_nValideSize--;
	T* data=new T[m_nValideSize];
	for(int i=0;i<index;i++)
		data[i]=temp[i];
	for(int i=index;i<m_nValideSize;i++)
		data[i]=temp[i+1];
	delete[] temp;
	temp=NULL;
	temp=new T[m_nValideSize];
	for(int i=0;i<m_nValideSize;i++)
		temp[i]=data[i];
	delete[] data;
	data=NULL;
	return ret;

}
template<class T,int N>
bool CMyArray<T,N>::RemoveAll()
{
	if(m_nValideSize==0)
	{
		cout<<"容器已经为空"<<endl;
		return flase;
	}
	delete[] temp;
	temp=NULL;
	m_nValideSize=m_nTotalSize=0;
	return true;
}
template<class T,int N>
bool CMyArray<T,N>::IsEmpty()const
{
	if(m_nValideSize==0)
		return true;
	return false;
}

主函数测试功能:

// C++模板类.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include "MyArray.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
/*	CMyArray<int,7> a(3);
	a.Show();
	a.Pop(5);
	a.Show();
	int len=a.GetLength();
	int size=a.GetTotalSize();
	cout<<len<<endl<<size<<endl;*/
/*	CMyArray<int,7> a(5);
	a.Show();
	a.Pop(6);
	a.ShowSize();
	a.Push();
	a.ShowSize();*/
/*	CMyArray<int,1> a(0);
	a.Show();
	a.Push();
	a.Show();
	CMyArray<float,1> str(0.001);
	str.Show();
	str.Push();
	str.Show();*/
	CMyArray<int> a(0);
	a[0]=5;
	a[1]=3;
	a.Show();
	a.RemoveAt(0);
	a.Show();
	a.IsEmpty();
	cout<<a<<endl;
	CMyArray<char> c('a');
	c.Show();
	return 0;
} 

指针是C++中的一把双刃剑,用得好可以事半功倍

同样,稍不注意就会造成内存泄露,产生野指针。

使用指针特别要注意:

有new 则有delete

new【】则对应则delete[]

C++(20/23)标准模板库编程 - 1 C++ 回顾 能够定义自定义数据类型是大多数编程语言的基本特性。在C++中,这通常通过类结构实现。代码清单1-4-1展示了一个名为Image的类定义,它展示了用户定义类的典型设计模式。本节示例代码Ch01_04使用Image类来强调创建用户定义类时需要注意的重要问题。需要说明的是,这个Image类并不完整,但已足够满足本节的教学目的。// Image.hpublic:private:#endif非模板类Image的声明始于定义名为pixel_t的别名,该别名用于指定整数类型。 阅读详情

相关推荐

金现代面试题—— i++,++i, &&,&|自动装箱和自动拆箱(int,byte,float等)|取int等基本类型的最大值

public static void main(String[] args){ int i=1,j=1; if(i++==2&amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;++j==2){ i=7; } System.out.println(“i=”+i+”,j=”+j); } 请给出 输出结果:

老孟嘚吧嘚 1396

【c++】新领域:“智能数组 ” 问世

int* arr;public:// 初始化数组i < size_;// 在析构函数中释放内存//借鉴了js中的 .length返回长度i < size;i++) {throw std::out_of_range("数组越界!");throw std::out_of_range("数组越界!");} else {//创建一个名为arr1的数组[可以直接通过列表创建]//遍历数组。

weixin_56334307的博客 500

全网最详细 解决戴维南定理的详细推导

替代定理,戴维南定理详细证明

m0_52555753的博客 3万+

c++20智能指针支持数组创建

一、c++11中的智能指针数组创建 在c++11中引入了智能指针这个概念,这个非常好,但是有一个问题显然被忘记了,如何动态创建智能指针数组,在c++11中没有提供直接的函数。换句话说,创建智能指针的make_shared,不支持创建数组。那在c++11中如何创建一个智能指针数组呢?只能自己封装或者变通实现,在c++14后可以支持构造函数创建智能指针数组,可这仍然不太符合技术规范发展的一致性,可继承性。 二、c++20中的智能指针数组的创建 基于上述的情况,在c++20中使用std::make_shared提

fpcc的专栏 4456

手把手教你用GPIO模拟MDIO时序,搞定Linux下那些‘不听话’的PHY芯片

本文详细介绍了如何利用Linux内核的`virtual,mdio-gpio`驱动,通过GPIO模拟MDIO时序来解决特殊PHY芯片的驱动调试问题。从硬件准备、设备树配置到驱动实现,提供了完整的解决方案和实战案例,帮助开发者应对非标准时序的PHY芯片挑战。

weixin_29188043的博客 270

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

C++内存管理(指针、数组、智能指针)

【代码】C++内存管理(指针、数组、智能指针)

weixin_55303547的博客 1162

Aider的Repo Map功能

要把整个项目的所有文件添加到 Repo Map 中,需要调整 Aider 的行为,让它扫描整个代码库并将所有文件纳入 Repo Map。在使用 Aider 时,Repo Map 默认只包含当前会话中明确指定的文件(通过命令行传入的。通过命令行将整个项目的文件列表传递给 Aider,使其初始化时包含所有文件。,让 Aider 在初始化时自动加载整个项目的文件到。如果你的项目是 Git 仓库,Aider 可以通过。在 Aider 的交互模式中,手动添加整个项目文件。,从而生成包含所有文件的 Repo Map。

qq_41638872的博客 1638

「C++系列」数组

你可以通过传递指向数组的指针来模拟这种行为,或者如果你在处理的是固定大小的数组,并且希望避免传递大小参数,你可以考虑使用模板(但这不是传递数组的“引用”,而是类型推导)。在C++中,指向数组的指针是一个特殊的指针,它指向数组的第一个元素的地址。然而,需要注意的是,指针本身并不知道它所指向的数组的大小,这意味着在通过指针遍历数组时,我们需要知道何时停止,以避免越界访问。然而,这种方法有局限性,因为它返回的总是同一个数组的引用,可能在多线程环境下导致问题,并且数组的大小在编译时就已确定。

日常笔记/总结/系列知识梳理 3094

智能车数字图像处理算法入门及C语言实现

智能车图像的最最基本入门算法介绍及C语言实现,二值化 - 特征识别 - 补线 - 中心巡线 - 偏差曲率计算。

不想随波逐流的大学生一枚,我们每个人都在努力奔跑 5110

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8333

C++中的动态数组与智能指针

动态数组不是数组!   将new T[] 分配得到的内存称为“动态内存”,这种说法其实不准确,使用new分配一个数组时,我们并未得到一个数组类型的对象,而是一个数组元素类型的指针,即使用类型别名定义一个数组类型,new也不会分配一个数组类型的对象。   我们正在分配一个数组的试试生之时不可见的,连[num]都没有,new返回的是一个元素类型的指针。   动态分配一个空数组时合法的 ...

weixin_30925411的博客 409

Pytorch入门实战(7):基于BERT实现文本隐喻二分类(Kaggle入门题目)

Bert入门实战,文本二分类问题

iioSnail的博客 4055

C++智能数组类实现:从类模板到移动语义的完整实践

在C++编程中,类模板是实现代码通用性的核心机制,它允许开发者编写独立于数据类型的通用代码。其原理是通过类型参数化,在编译时生成特定类型的代码实例,从而提升代码复用性和类型安全性。这种技术价值在于能够构建高度可复用的数据结构库,如STL容器。在工程实践中,类模板常与资源管理机制结合,用于实现自定义容器类。通过实现一个智能数组类,可以深入理解C++的RAII(资源获取即初始化)原则和移动语义。RAII通过构造函数获取资源、析构函数释放资源,确保异常安全;而移动语义则通过转移资源所有权而非复制,显著提升包含动态

weixin_32430941的博客 321

OV9734 DATASHEET,完整规格书

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++学习笔记--数组类模板、智能指针模板、单例类模板

上一节中讲到类模板,本节就针对类模板常用的例子来强化类模板。 数组类模板 前面讲过类模板的泛指类型参数,在模板参数中除了类型参数还有一种数值型参数,数值型参数也有他自身的限制: 变量不能作为模板参数,什么意思呢?在声明了一个数值型参数后不能指定一个变量作为实际类型参数。 浮点数不能作为模板参数。 类对象不能作为模板参数。 本质上就是说数值型模板参数是在编译阶段被处理的单元,因此在编译阶

一念之间、 390

Statistics and Machine Learning Toolbox

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

C++解析(27):数组、智能指针与单例类模板

0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3.2 单例类模板 4.小结 1.数组类模板 模板参数可以是数值型参数(非类型参数): 数值型模板参数的限制: 变量不能作为模板参数 浮点数不能作为模板参数 类对象不能作为模板参数 。。。...

weixin_30568591的博客 135

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++语言学习(十七)——模板

C++语言学习(十七)——模板 一、模板简介 泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。 泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的核心思想是参数化类型,即把一个原本特定于某个类型的算法或类当中的类型信息抽掉...

weixin_34217711的博客 372

模板类的定义与实现

#ifndef ARRAY_H_INCLUDED #define ARRAY_H_INCLUDED #include template class Array{ public:     // Create an array with a default size that will grow as needed     Array();     vi

LiangJishengBlog 896

C++深度解析教程笔记14-模板(函数,类,数组类,智能指针类,单例),异常处理

t c = a;\ a = b;\ b = c;int c = a;a = b;b = c;a = b;b = c;a = b;b = c;int a = 0;int b = 1;return 0;\ t c = a;\ a = b;\ b = c;int c = a;a = b;b = c;a = b;b = c;a = b;b = c;int a = 0;int b = 1;

qq_35429166的博客 1224

17. C++中的类模板

在学习类模板之前,建议先学习下函数模板的内容。 类是C++的核心,那是否能够将函数模板的思想应用于类呢? 类模板 一些类主要用于存储和组织数据元素。如:数组类,链表类,Stack类,Queue类等等。C++中可以将模板的思想应用于类,使得类可以不关注具体所操作的数据类型,而只关注类所需要实现的功能。 C++中的类模板,提供一种特殊的类以相同的行为处理不同的类型,在类声明前使用templat...

zhubao124的博客 551

c++_狄泰总结05泛型编程((函数/类模板)

泛型编程1)函数模板(C++泛型编程的一种)2)类模板类模板特化实例3)数组类模板**案例1:用最高效的方式来求 1+2+3+...+N****案例2: 数值型参数类模板**案例3:堆数组类模版构建(简易的线性表数据结构)4)智能指针类模板案例:编写智能指针类模板 ==》参照STL auto_ptr的设计STL中的智能指针(本质是对象)案例1:STL auto_ptr 使用案例QT中的智能指针案例...

camel_ant 553

C++泛型编程与运算符重载实战:构建通用数组类

泛型编程通过类型参数化实现代码复用,其核心原理是模板在编译期生成类型特化代码,确保类型安全且无运行时开销。运算符重载则赋予自定义类型直观的操作语义,提升代码可读性。这两项技术结合能显著提升工程实践中的开发效率与代码质量,广泛应用于容器库、算法库等场景。本文以构建泛型数组类为例,深入解析模板实例化、友元函数等关键机制,并探讨深拷贝、异常安全等工程实践要点,帮助开发者掌握从硬编码到软实力的跨越。

weixin_34268843的博客 477

6.C++的模板【由浅入深-C++】

本文介绍C++模板的相关内容。

插花弄玉的博客 1346

C++模板编程:从泛型基础到智能指针实战

泛型编程是现代软件开发中实现代码复用和类型安全的核心技术,它通过参数化类型来创建可处理多种数据类型的通用组件。其原理在于编译器在编译期根据具体类型生成特化代码,实现了零成本抽象,既保证了性能又提升了代码的灵活性和可维护性。这项技术的核心价值在于解决了算法和数据结构对不同数据类型的适配问题,广泛应用于容器库、算法库和通用工具的开发中。在C++中,模板是实现泛型编程的基石,通过函数模板和类模板,开发者可以构建如智能指针这样的高级抽象,从而将类型参数化思想自然收敛到构建健壮、高效的资源管理工具这一实践主题上。

weixin_32430941的博客 341

C++模板编程:从函数模板到类模板的泛型编程实践

泛型编程是一种编程范式,其核心思想是将算法和数据结构与具体数据类型分离,编写不依赖于特定类型的通用代码。在C++中,这一理念通过模板技术实现,它允许将类型作为参数传递,由编译器在编译时生成特定类型的代码。模板的技术价值在于提升代码的复用性、类型安全性和性能,避免了为不同数据类型重复编写相似代码的冗余。其应用场景广泛,从实现通用算法(如排序、查找)到构建通用数据结构(如向量、列表、映射容器)都离不开模板。本文以C++模板为主题,深入解析了函数模板的编写与实例化、类模板的定义与成员函数实现,并探讨了模板特化、偏

weixin_30832405的博客 325
上一篇: MFC模拟双色球抽奖
下一篇: C++基础——抽象基类(ABC)
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值