【C++】模板类顺序表

c++顺序表模板类 #include <iostream> using namespace std; class OutOfBound {}; class IllegalSize {}; template <class elemType> class list { public: virtual void clear() = 0; virtual int length()... 阅读详情

1.什么是模板

    模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。如果我们写一个普通的顺序表,那它只能满足一种数据存储类型,之后如果想把这个顺序表改成其他数据类型的顺序表,那就必须得改代码了,感觉很麻烦,还容易出错。所以,写一个模板类顺序表,在构建顺序表的时候把数据类型传过去,这样,顺序表存储的数据类型我们想传个什么就能构建什么数据类型的顺序表。是不是很方便?

2.模板类顺序表的代码实现


#define _CRT_SECURE_NO_WARNINGS 1 

#ifndef _SEQLIST_H__
#define _SEQLIST_H__

#include<iostream>
#include<string>
using namespace std;
template <typename T>
class Seqlist
{
	template <typename T>
	friend ostream &operator<<<T>(ostream &os, const Seqlist<T> &list);//输出运算符重载
public:
	Seqlist();    //构造函数
	~Seqlist();   //析构函数
	Seqlist(const Seqlist&list);   //拷贝构造
	Seqlist<T>& operator=(const Seqlist<T>& list);  //赋值运算符重载
	T& operator[](const int index);  //[]运算符重载
	void PushBack(T x);   //尾插
	void PopBack();     //尾删
	void PushFront(T x);  //头插
	void PopFront();    //头删
	void Remove(T x);   //删除指定数据
	void RemoveAll(T x);  //删除顺序表中指定的所有数据
	void Insert(int pos, T x);   //指定位置插入指定元素
private:
	void Reserve(int sz);
	T* _data;
	int _sz;
	int _capacity;
};
template <typename T>
void Seqlist<T>::Reserve(int sz)
{
	if (_capacity <= sz)
	{
		T*tmp = new T[sz];
		for (int i = 0; i < _sz; i++)
		{
			tmp[i] = _data[i];
		}
		delete[] _data;
		_data = tmp;
		_capacity = sz;
	}
}
template <typename T>
ostream &operator<<(ostream &os, const Seqlist<T> &list)
{
	for (int i = 0; i <list._sz; i++)
	{
		os << list._data[i] << " ";
	}
	return os;
}
template <typename T>
Seqlist<T>::Seqlist()
:_data(new T[3]), _sz(0), _capacity(3)
{}

template <typename T>
Seqlist<T>::~Seqlist()
{
	if (_data != NULL)
	{
		delete[] _data;
		_data = NULL;
		_sz = 0;
		_capacity;
	}
}
template <typename T>
Seqlist<T>::Seqlist(const Seqlist&list)   //拷贝构造
{
	_data = new T[list._capacity];
	_sz = list._sz;
	_capacity = list._capacity;
	for (int i = 0; i < _sz; i++)
	{
		_data[i] = list._data[i];
	}

}
template <typename T>
Seqlist<T>& Seqlist<T>::operator=(const Seqlist<T>& list)
{
	_data = new T[list._capacity];
	_sz = list._sz;
	_capacity = list._capacity;
	for (int i = 0; i < _sz; i++)
	{
		_data[i] = list._data[i];
	}
	return *this;
}

template <typename T>
void Seqlist<T>::PushBack(T x)
{
	Reserve(_sz + 1);
	_data[_sz] = x;
	_sz++;
}

template <typename T>
void Seqlist<T>::PopBack()
{
	if (_sz == 0)
	{
		cout << "无数据可删" << endl;
		return;
	}
	else
	{
		_data[_sz - 1] = NULL;
		_sz--;
	}
}

template <typename T>
void Seqlist<T>::PushFront(T x)
{
	Reserve(_sz + 1);
	for (int i = _sz; i > 0; i--)
	{
		_data[i] = _data[i - 1];
	}
	_data[0] = x;
	_sz++;
}

template <typename T>
void Seqlist<T>::PopFront()
{
	if (_sz == 0)
	{
		cout << "无数据可删" << endl;
		return;
	}
	else
	{
		for (int i = 0; i < _sz - 1; i++)
		{
			_data[i] = _data[i + 1];
		}
		_sz--;
	}
}

template <typename T>
T& Seqlist<T>::operator[](const int index)
{
	return _data[index];
}
template <typename T>
void Seqlist<T>::Remove(T x)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < _sz; i++)
	{
		if (_data[i] == x)
		{
			for (j = i; j <= _sz - 1; j++)
			{
				_data[j] = _data[j + 1];
			}
			_sz--;
		}
	}
	if (j == 0)
	{
		cout << "无该元素" << endl;
	}
}

template <typename T>
void Seqlist<T>::RemoveAll(T x)
{
	int i = 0;
	int j = 0;
	int count = 0;
	if (_sz == 0)
	{
		cout << "无数据可删" << endl;
		return;
	}

	while (i < _sz)
	{
		if (_data[i] == x)
		{
			for (j = i; j < _sz; j++)
			{
				_data[j] = _data[j + 1];
			}
			_sz--;
		}
		else
			i++;
	}
	if (j == 0)
	{
		cout << "无该数据" << endl;
		return;
	}
}
template <typename T>
void Seqlist<T>::Insert(int pos, T x)
{
	Reserve(_sz + 1);
	if (pos == 1)
	{
		PushFront(x);
	}
	else if (pos == _sz + 1)
	{
		PushBack(x);
	}
	else
	{
		for (int i = _sz; i > pos - 1; i--)
		{
			_data[i] = _data[i - 1];

		}
		_data[pos - 1] = x;
		_sz++;
	}
}
void test1()
{
	Seqlist<int> seq;     
	seq.PushBack(1);       //测试尾插
	seq.PushBack(2);
	seq.PushBack(3);
	seq.PushBack(4);
	cout << seq << endl;
	seq.PopBack();          //测试尾删
	cout << seq << endl;
	seq.PopBack();
	cout << seq << endl;
	seq.PopBack();
	cout << seq << endl;
	seq.Insert(1, 9);         //测试插入函数
	cout << seq << endl;
	Seqlist<string> Seq;         //测试非自定义数据类型顺序表能不能构建成功
	Seq.PushBack("hello");
	Seq.PushBack(" ");
	Seq.PushBack("world");
	cout << Seq << endl;
}

void test2()
{
	Seqlist<int> seq;
	seq.PushFront(1);   //测试头插
	seq.PushFront(2);
	seq.PushFront(3);
	seq.PushFront(2);
	seq.PushFront(2);
	seq.PushFront(4);
	cout << seq << endl;
	//seq.Remove(2);            //测试删除函数
	//seq.RemoveAll(2);            //测试删除顺序表中出现的所有某个数据成员函数
	cout << seq << endl;
	/*cout << seq << endl;
	seq.PopFront();                //测试头删
	cout << seq << endl;
	seq.PopFront();
	cout << seq << endl;
	seq.PopFront();
	cout << seq << endl;
	seq.PopFront();
	cout << seq << endl;*/

	Seqlist<string> seq1;
	seq1.PushFront("hello");
	seq1.PushFront("hello");
	seq1.PushFront("askhashglaksdfsdfasdfsdfdga");
	seq1[2] = "bit";
	cout << seq1 << endl;
	seq1.PopFront();
	cout << seq1 << endl;
	seq1.PopFront();
	cout << seq1 << endl;
	seq1.PopFront();
	cout << seq1 << endl;
	Seqlist<string> seq2(seq1);  //测试拷贝构造
	cout << seq2 << endl;
	Seqlist<string> seq3 = seq2;  //测试赋值运算符重载
	cout << seq3 << endl;
}
#endif
#include"Seqlist.h"

int main()
{
	test1();
	//test2();
	getchar();
	return 0;
}

注意:

在使用C++模板时,不能将函数声明和实现放在两个不同的文件里,即使你将声明的文件引入实现文件里,编译也无法通过,因为c++不支持模板的分离编译。
解决办法:
1. 在模板头文件 xxx.h 里面显示实例化->模板类的定义后面添加 template class SeqList<int >; 一般不推荐这种方法,一方面老编译器可能不支持,另一方面实例化依赖调用者。(不推荐)
 2. 将声明和定义放到一个文件 "xxx.hpp" 里面,推荐使用这种方法。


C++ 顺序表的基本操作(使用模版类) 一、遇到问题:        原因:类的函数定义不能放在SeqList.cpp中,必须放在Seqlist.h(类的函数声明和定义放在同一个文件下)中,否则        会出现以下问题。         二、实现程序:    1.SeqList.h #ifndef SeqList_h #define SeqList_h #include &lt;iostream&gt; using ... 阅读详情

相关推荐

数据结构之循环队列(顺序表存储)——C++模板类实现

基于数组存储形式的循环队列实现  循环队列的基于数组的存储表示亦称为顺序队列,用一个一维数组elem[maxSize]来实现,其中为了区别队列空与满,该数组中最多存储maxSize-1个元素,如此一来,判断循环队列满的条件便是: (_rear + 1) % maxSize == _rear 而判断循环队列空的条件则是: _rear == _front  之所以要取模maxSize是为了节

Sothan 1117

顺序表模板,C++源代码

数据结构与算法的线性表模板,源代码

m0_75150245的博客 350

Windows应急响应实战:灰鸽子木马检测与清除全流程解析

远程控制木马(RAT)是一种基于客户端/服务器(C/S)架构的恶意软件,攻击者通过它能够远程操控受害主机,实现屏幕监控、文件窃取、键盘记录等操作,对个人隐私与企业数据安全构成严重威胁。其技术原理通常涉及进程注入、网络通信、持久化机制等核心环节,在应急响应中具有极高的分析价值。掌握此类木马的检测与清除方法,是Windows系统安全防护与事件处置的基本功。本文以经典的灰鸽子木马为例,结合进程分析、网络排查、注册表检查等实战技术,系统讲解从行为识别、痕迹取证到彻底清除的完整操作流程,并涵盖Rootkit对抗、无文

weixin_30521161的博客 415

顺序表(C++类模板)

1.动态数组顺序表实现(C++) 1.Mylist.h头文件包含类模板以及方法声明 #ifndef MYLIST_H_ #define MYLIST_H_ #include<iostream> #define InitialSize 10 //默认的最大长度 template<class ElementType> class MyList { private: ElementType* data; int MaxSize; int length; pub

weixin_45859425的博客 573

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3184

27930-2023与27930-2015区别

描述了27930-2023与27930-2015的更新点

manjixingkong1234的专栏 3850

数据结构:顺序表之C++模板类实现

C++模板类实现顺序表相较c语言实现, 表的创建和销毁可以构造与析构函数管理。 定义表的长度、容量以及内存数组可以用私有成员实现,替代c语言中的结构体定义。 c定义: 定义表的结构体 typedef struct _tag_SeqList { int length; int capacity; unsigned int **node; }TSeqList; 其二是在操作函...

baidu_35260565的博客 987

三菱FX5U气缸控制功能块(完整ST源代码+示例程序)

如果机器包含100个气缸,我们只需要修改数组的元素数量就可以了,效率非常的高。待续....博途PLC 面向对象系列之“双通气缸功能块“(SCL代码)_plc面向对象-优快云博客文章浏览阅读667次。本文介绍了博途PLC中面向对象编程的应用,重点讲解了双通气缸的功能块设计,包括双通电磁阀功能块、双通气缸的UDT数据类型以及SCL代码实现。同时,对比了双通与单通电磁阀的差异,并讨论了将单通气缸改造为双通气缸的方法,强调了双通气缸在安全性上的优势。

RXXW_Dor的博客 1029

C++数据结构之顺序表(模板类实现)

用模板类实现顺序表数据结构

sagjhdj的博客 2823

手把手完整实现STM32+ESP8266+MQTT+阿里云服务器+手机APP应用——第一节—阿里云物联网平台配置+IoTStudio界面绘制+MQTT.fx模拟MQTT客户端与使用AT命令发布订阅消息

通过MQTT.fx模拟连接以及通过CH340串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266(本系列使用了ESP8266-ESP01/01S以及正点原子的ATK-ESP8266) 来连接网络,获取设备数据发送到阿里云物联网平台并显示数据,通过IOT studio界面显示数据并发送命令控制设备。本系列使用的主控芯片是STM32F103系列,当然也可以使用其他系列单片机都可以实现,思路都是一样的。同时本系列有手机APP源

嵌入式阿齐Archie 5万+

AE-扭曲-变形-弧

一些AE效果的着色器实现记录

What_can_you_do的博客 1176

C++实现顺序表(模板类)

C++实现动态(可扩容)顺序表 .h—头文件 #pragma once #include<iostream> #include<cassert> using namespace std; template<class T> class Seqlist { private: T* _array; size_t _capacity;//容量 size_t ...

晶凌玄夜的博客 1396

SAP_SD模块更改销售订单定价简介

方式优点缺点适用场景MASS简单,无需开发不能触发重新定价逻辑修改特定字段BDC (VA02)可模拟人工操作维护复杂,速度慢少量订单批改稳定、安全需ABAP支持推荐用于批量重新定价VBOF标准重算返利仅适返利类条件返利更新通过本文,我们了解了 SAP 的[SAP_SD模块更改销售订单定价]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!

我小时候很黑的博客 715

C++模板类实现顺序表

C++模板类实现顺序表#include<iostream> #include<assert.h> #include<string> using namespace std; #pragma warning(disable:4996)template<class T> class Seqlist //定义一个顺序表的类 { public: Seqlist() //构造函数 :_

Nou_Camp的博客 950

基于LLM的电商数据分析系统

随着电商行业的蓬勃发展,每天都会产生海量的数据,这些数据包含了用户的行为信息、商品信息、销售数据等。如何从这些繁杂的数据中提取有价值的信息,为电商企业的决策提供支持,成为了一个关键问题。基于LLM的电商数据分析系统的目的就是利用大语言模型强大的自然语言处理和数据分析能力,对电商数据进行深入挖掘和分析,帮助企业了解市场趋势、用户需求、商品销售情况等,从而制定更加合理的营销策略、优化商品库存管理、提升用户体验等。本系统的范围涵盖了电商领域的多个方面,包括用户行为分析、商品分析、销售数据分析等。

AI Python 编程之道的博客 808

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数据结构-顺序表与单链表的C++模板类实现

C++模板类实现顺序表 实现功能:  1.尾插,2.头插,3.显示,4.尾删,5.头删,6.按位置,7.插按值插,8.按位置删,9.按值删,10.按值查,11.求表长,12.清除数据,13.摧毁该顺序表,14.反转,15.冒泡排序。 顺序表模板类实现代码: //顺序表********************************************************

Alan_1550587588的博客 912

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【C++】用模板类实现顺序表

一、模板类的结构 template class  类名 { 定义内容 }; 注:1.在模板类外定义成员函数时每个函数名上一行都要添加 template 2.函数在定义时加作用域的方式为   void  Seqlist::Funtest() 例: template class Seqlist { public: void Funtest(); { cout

lz201788的博客 857

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c++模板类顺序表Vector

模板类顺序表 这次在顺序表之后,又再次学习了模板,于是便想着将模板类的顺序表实现出来,因为前段时间时间电脑出了些问题,很是悲伤,所以前面的就不补了,反正只要能看懂模板类的,再懂模板中的推理和实例化,这样应该都不是问题。 下面就上代码:#pragma once #include #include #include using namespace std; template cl

yangjinkui的博客 965

c++ 通过顺序表,链表实现队列操作,使用模板类

同时模板指针格式应为 mytemplate<elment>* ,mytemplate<elment>是一种格式,而不是。mytemplate*<elment>, 不存在数据类型mytemplate*,在创建指针时应指出变量类型所以应为。使用模板类不能在使用typedef,系统无法分配内存。

s103424的博客 492

顺序表C++模板类封装

顺序表+泛型+类的封装+实现cpp

WSTONECH的博客 531

C++数据结构 顺序表的实现(模板类的实现)

利用模板类实现顺序表的操作 实现的功能:  1.尾插,2.头插,3.显示,4.尾删,5.头删,6.按位置,7.插按值插,8.按位置删,9.按值删,10.按值查,11.求表长,12.清除数据,13.摧毁该顺序表,14.反转,15.排序(冒泡排序,快速排序)。 头文件源代码: #pragma once // 防止重复编译 #include using namespace std

钟琦的专栏 8613

数据结构之顺序表——C++模板类实现

数据结构之顺序表——C++模板类实现 #ifndef LINEARLIST_H_INCLUDED #define LINEARLIST_H_INCLUDED #include using namespace std; template class LinearList { public: LinearList() {cout << "Constructing a LinearList in defaul

Sothan 733

【C++】实现顺序表模板类

#include&lt;iostream&gt; #include&lt;string.h&gt; using namespace std; template&lt;class T&gt; class SeqList{ public: SeqList(); SeqList(const SeqList&lt;T&gt;&amp; seq); SeqList&amp; o...

Moralin_的博客 685

数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月

数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月

_清风明月的博客 1029
上一篇: 【C++】模拟实现string类(版本二:用写时拷贝来实现)
下一篇: 【C++】模板类链表
pointer_y
博客等级 码龄11年 157粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值