<三>使用类模板实现STL Vector
使用类模板实现STL Vector,点击查看代码
#include <iostream>
using namespace std;
template<typename T>
class MyVector {
public:
//构造函数
MyVector<T>(int size = 10) {
T * _tep = new T[size]();
first = _tep;
last = _tep;
end = first + size;//
cout << "构建Vector,首地址" << first << endl;
}
//拷贝构造
MyVector<T>(const MyVector<T> & _src) {
//对方vector是为空
if (_src.Empty()) {
int srcVectorySize = _src.getVectorSize();
T * _tep = new T[srcVectorySize]();
first = _tep;
last = _tep;
end = first + srcVectorySize;//
cout << "拷贝构造构建Vector,空拷贝" << endl;
}
else {
int srcVectorySize = _src.getVectorSize();
T * _tep = new T[srcVectorySize]();
first = _tep;
last = _tep;
end = first + srcVectorySize;//
T * _srcVectorElementPoint = _src.first;
while (_srcVectorElementPoint < _src.last) {
*_tep = *_srcVectorElementPoint;
_tep++;
_srcVectorElementPoint++;
}//end
last=_tep;
cout << "拷贝构造构建Vector" << endl;
}
}
//赋值函数
MyVector<T> & operator=(const MyVector<T> & _src)
{
//避免重复
if (this == &_src) { return *this; }
//释放现有堆上资源空间
if (this->Empty() == false) {
delete[]first;
first = nullptr;
last = nullptr;
end = nullptr;
}
int srcVectorySize = _src.getVectorSize();
T * _tep = new T[srcVectorySize]();
first = _tep;
last = _tep;
end = first + srcVectorySize;//
T * _srcVectorElementPoint = _src.first;
while (_srcVectorElementPoint < _src.last) {
*_tep = *_srcVectorElementPoint;
_tep++;
_srcVectorElementPoint++;
}//end
last = _tep;
cout << "赋值函数构建Vector" << endl;
}
//析构函数
~MyVector<T>() {
if (Empty() == false) {
delete[]first;
first = nullptr;
last = nullptr;
end = nullptr;
cout << "析构Vector,堆地址"<<first << endl;
}
}
//添加值,返回指向当前元素的指针,返回为 const * 不允许修改
const T * addValue(const T & _srcValue) {
//满空间,两倍扩容
if (Full()) {
Expend();
}
*last = _srcValue;
last++;
cout << "Vector添加元素,元素地址" << last << endl;
return last;
}
//获取指定下标的值
T getValue(int index) const {
if (index<0) { return *first; }
if (index > this->getVectorSize()) { return *(last-1); }
int flag = 0;
T *elementPoint = first;
while (flag < index) {
elementPoint++;
flag++;
}
cout << "获取Vector元素值,元素地址" << elementPoint <<"元素值"<< *elementPoint << endl;
return *elementPoint;
}
//编辑指定下标元素的值,返回当前节点的指针 不允许通过返回指针修改
const T * eidtValue(int index,const T & _value) {
if (index > this->getVectorSize() || index<0) { return nullptr; }
int flag = 0;
T *elementPoint = first;
while (flag < index) {
elementPoint++;
flag++;
}
*elementPoint = _value;
cout << "编辑Vector元素值,元素地址" << elementPoint << "元素值" << *elementPoint << endl;
return elementPoint;
}
//判断是否为空
bool Empty() const {
if (first == last) { return true; }
return false;
}
//判断空间是否满
bool Full() const{
if (last == end) { return true; }
return false;
}
int getVectorSize() const {
return this->end - this->first;
}
void printVector() const {
cout << "打印数组元素" << endl;
T *elementPoint = first;
int index = 0;
while (elementPoint < last)
{
cout.precision(4);
cout << "[" << index << "]=" << (*elementPoint) <<"该元素地址="<< elementPoint << endl;
elementPoint++;
index++;
}
}
private:
T * first;
T * last;
T * end;
//两倍扩容
void Expend() {
int size = this->getVectorSize();
int newSize = size * 2;
T *newFirst = new T[newSize];
T *newLast = newFirst;
T *newEnd = newFirst + newSize;
const T *srcElementPoint = this->first;
while (srcElementPoint < this->last) {
*newLast = *srcElementPoint;
newLast++;
srcElementPoint++;
}
//释放原有空间
delete[]first;
first = nullptr;
last = nullptr;
end = nullptr;
first = newFirst;
last = newLast;
end = newEnd;
cout << "两倍扩容新堆内存地址"<< first << endl;
}
};
int main() {
MyVector<int> v1 (6) ;
v1.addValue(10);
v1.addValue(9);
v1.addValue(8);
v1.addValue(7);
v1.addValue(6);
v1.addValue(5);
v1.printVector();
v1.addValue(4.0);
v1.printVector();
v1.eidtValue(2, 100);
v1.printVector();
int getValue = v1.getValue(3);
cout << "getValue =" << getValue << endl;
MyVector<int> v2 = v1;
v2.printVector();
MyVector<int> v3(10);
v3 = v1;
v3.printVector();
system("pause");
return 1;
}
<三>使用类模板实现STL Vector的更多相关文章
- C++标准模板库(STL)——vector常见用法详解
vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++类模板的三种特化
说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多.我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型: 二是特化为引用,指针 ...
- ZT 类模板Stack的实现 by vector
*//*第3章 类模板 与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,你就可以实现容器类,而不需要确定容器中元素 ...
- C++标准库类模板vector
vector是C++标准库STL中的一个重要的类模板,相当于一个更加健壮的,有很多附加能力的数组 使用vector前首先要包含头文件 #include<vector> 1.vector的 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- 【C++】模板简述(三):类模板
上文简述了C++模板中的函数模板的格式.实例.形参.重载.特化及参数推演,本文主要介绍类模板. 一.类模板格式 类模板也是C++中模板的一种,其格式如下: template<class 形参名1 ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- c/c++ 模板与STL小例子系列<三> traits
c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
随机推荐
- KingbaseES 如何实现Oracle pipelined 功能
管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其赋值给集合变量.KingbaseES 数据库可以用 setof 实 ...
- logstash客户端传送symantec日志到elasticsearch
一.安装相应版本的logstash wget https://artifacts.elastic.co/downloads/beats/logstash/logstash-7.5.2-x86_64.r ...
- HTTP和Servlet快速入门
目录 1.HTTP 1.1 请求数据格式 1.2 相应数据格式 2.Servlet 3.Servlert的xml配置 1.HTTP 1.1 请求数据格式 请求行:请求数据的第一行 包含三个内容,按顺序 ...
- 互联网公司员工职级、研发效能度量、OKR与绩效考核
今天要写这篇文章,来自最近有两个点触动了我.第一个触动点是奈飞(netflix)做出了一个巨大动作<"不搞职级.人人平等" 25 年后行不通了?Netflix 破天荒引入细分 ...
- jumpserver设置某个用户登陆后,直接进入指定的服务器,不需要通过导航web终端--我的资产--服务器一连串的展开
ssh jumpserverUsername@systemUsername@AssetIP@jumpserverHostIP -p2222 解释: - jumpserverUsername:登录 Ju ...
- Beats:使用Elastic Stack监控RabbitMQ
- DevOps图示
- SQL通用语法和SQL分类
SQL通用语法 1.SQL 语句可以单行或多行书写,以分号结尾 2.可使用空格和缩进来增强语句的可读性 3.MySQL 数据库的SQL语句不区分大小写,关键字建议使用大写 4.3种注释 单行注释: - ...
- varchar与varchar2的区别
1. varchar2所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节. 2. varchar2把空串等同于null处理,而varchar ...
- BZOJ3732 Network(Kruskal重构树)
Kruskal重构树的模板题. 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N.图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: ...