143.vector模板库
- myvector.h
#pragma once
#include <initializer_list>
#include <iostream>
using namespace std; template<class T>
class myvector
{
public:
myvector();
myvector(int n);
myvector(initializer_list<T> my);
void show() const;
~myvector();
//用于迭代
T *begin();
T *end();
int arraysize();
int memsize();
//后插
void push_back(T data);
//前插
void push_front(T data);
//返回的是副本
T operator[](int i) const;
//返回的不是副本
T &operator[](int i);
//发现左值
T* find(T &t);
//发现右值
T* find(T &&t);
//改变一个值,传递的是右值
void change(T *pos, T &&t);
//改变一个值,传递的是左值
void change(T *pos, T &t);
void del(T &t);
void del(T &&t);
//找到的位置之前插入
void insert(T &t, T &newt);
void insert(T &&t, T &&newt); template<class T>
friend ostream& operator <<(ostream &out, myvector<T> &myv);
public:
T * p;
int memn;//内存长度
int realn;//数组长度
}; - myvector.cpp
#include "myvector.h" template<class T>
myvector<T>::myvector():p(nullptr),memn(),realn()
{ } template<class T>
myvector<T>::myvector(int n)
{
this->memn = this->realn = n;
this->p = new T[n];
memset(this->p, , sizeof(T)*n);
} template<class T>
myvector<T>::myvector(initializer_list<T> my)
{
this->realn = this->memn = my.size();
this->p = new T[my.size()];
int id = ;
//初始化
for (auto i : my)
{
this->p[id] = i;
id++;
}
} template<class T>
void myvector<T>::show() const
{
for (int i = ; i < realn; i++)
{
cout << p[i];
}
} template<class T>
myvector<T>::~myvector()
{
if (p != nullptr)
{
delete[] this->p;
}
} template<class T>
T * myvector<T>::begin()
{
return this->p;
} template<class T>
T * myvector<T>::end()
{
return this->p + this->realn;
} template<class T>
int myvector<T>::arraysize()
{
return this->realn;
} template<class T>
int myvector<T>::memsize()
{
return this->memn;
} template<class T>
void myvector<T>::push_back(T data)
{
if (this->p == nullptr || this->memn == )
{
p = new T;
*p = data;
memn = ;
realn = ;
}
else if(memn == realn)
{
T *ptemp = new T[this->memn + ];
memcpy(ptemp, this->p, this->realn * sizeof(T));
*(ptemp + realn) = data;
delete[] this->p;
this->p = ptemp;
realn += ;
memn += ;
}
else
{
p[realn] = data;
realn++;
}
} template<class T>
void myvector<T>::push_front(T data)
{
if (this->p == nullptr || this->memn == )
{
p = new T;
*p = data;
memn = ;
realn = ;
}
else if (memn == realn)
{
T *ptemp = new T[this->memn + ];
memcpy(ptemp + , this->p, this->realn * sizeof(T));
*ptemp = data;
delete[] this->p;
this->p = ptemp;
realn += ;
memn += ;
}
else
{
for (int i = ; i < realn; i++)
{
p[i + ] = p[i];
}
p[] = data;
realn += ;
}
} template<class T>
T myvector<T>::operator[](int i) const
{
if (i > realn)
{
throw ;
}
return this->p[i];
} template<class T>
T & myvector<T>::operator[](int i)
{
if (i > realn)
{
throw ;
}
return this->p[i];
} template<class T>
T * myvector<T>::find(T & t)
{
for (auto ib = this->begin(); ib != this->end(); ib++)
{
if (*it == t)
{
return ib;
}
}
} template<class T>
T * myvector<T>::find(T && t)
{
for (auto ib = this->begin(); ib != this->end(); ib++)
{
if (*it == t)
{
return ib;
}
}
} template<class T>
void myvector<T>::change(T * pos, T && t)
{
if (pos != nullptr)
{
*pos = t;
}
} template<class T>
void myvector<T>::change(T * pos, T & t)
{
if (pos != nullptr)
{
*pos = t;
}
} template<class T>
void myvector<T>::del(T & t)
{
int pos = -;
for (int i = ; i < this->realn; i++)
{
if (t == *(this->p + i))
{
pos = i;
break;
}
}
if (pos != -)
{
if (pos == this->realn)
{
this->realn -= ;
}
else
{
for (int i = pos; i < realn-; i++)
{
p[i] = p[i + ];
}
realn -= ;
}
}
} template<class T>
void myvector<T>::del(T && t)
{
int pos = -;
for (int i = ; i < this->realn; i++)
{
if (t == *(this->p + i))
{
pos = i;
break;
}
}
if (pos != -)
{
if (pos == this->realn)
{
this->realn -= ;
}
else
{
for (int i = pos; i < realn - ; i++)
{
p[i] = p[i + ];
}
realn -= ;
}
}
} template<class T>
void myvector<T>::insert(T & t, T & newt)
{
int pos = -;
for (int i = ; i < this->realn; i++)
{
if (t == *(this->p + i))
{
pos = i;
break;
}
} if (pos != -)
{
if (this->realn == this->memn)
{
T *ptemp = new T[this->memn + ];
memcpy(ptemp, this->p, sizeof(T)*memn); delete[] this->p;
this->p = ptemp;
this->realn += ;
this->memn += ;
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];
}
p[pos] = newt;
}
else
{
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];
}
p[pos] = newt;
this->realn += ;
}
} } template<class T>
void myvector<T>::insert(T && t, T && newt)
{
int pos = -;
for (int i = ; i < this->realn; i++)
{
if (t == *(this->p + i))
{
pos = i;
break;
}
} if (pos != -)
{
if (this->realn == this->memn)
{
T *ptemp = new T[this->memn + ];
memcpy(ptemp, this->p, sizeof(T)*memn); delete[] this->p;
this->p = ptemp;
this->realn += ;
this->memn += ;
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];
}
p[pos] = newt;
}
else
{
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];
}
p[pos] = newt;
this->realn += ;
}
}
} template<class T>
ostream & operator<<(ostream & out, myvector<T> & myv)
{
for (int i = ; i < myv.realn; i++)
{
out << myv.p[i];
}
return out;
} - main.cpp
#include "myvector.h"
#include "myvector.cpp" void main()
{
myvector<double> myv({ 1.1,2.2,3.3 });
//myv.show();
////迭代器
//for (auto i : myv)
//{
// cout << i << endl;
//}
myv.push_front(4.4);
myv.push_back(5.5);
myv.insert(2.2, 8.8);
myv.del(2.2);
myv.push_back(2.2);
myv.del(2.2);
/*for (auto ib = myv.begin(), ie = myv.end(); ib != ie; ib++)
{
cout << *ib << endl;
}*/
//cout << myv[1] << endl;
cout << myv << endl;
myv.show();
cin.get();
}
143.vector模板库的更多相关文章
- 35.自己实现vector模板库myvector
myvector.h #pragma once //自己写的vector模板库 template <class T> class myvector { public: //构造 myvec ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- C++ 标准模板库(STL)——容器(Containers)的用法及理解
C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
- C++标准模板库(STL)之Vector
在C中,有很多东西需要自己实现.C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++:标准模板库vector
一:介绍 vector是C++标准模板库,是一个容器,底层是数组,为连续内存. 命名空间为std,所属头文件为<vector> 注意:不是<vector.h> vector ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
随机推荐
- 求区间连续不超过K段的最大和--线段树+大量代码
题目描述: 这是一道数据结构题. 我们拥有一个长度为n的数组a[i]. 我们有m次操作.操作有两种类型: 0 i val:表示我们要把a[i]修改为val; 1 l r k:表示我们要求出区间[l,r ...
- IPv6系列-入门指南
本文是<IPv6系列>文章的第一篇<入门指南>,用于快速了解并上手IPv6. 小慢哥的原创文章,欢迎转载 目录 ▪ 一. 为什么要了解IPv6 ▪ 二. 顾虑:IPv6地址太复 ...
- Ubuntu18.04修改Hostname
1. 设置新的hostnamesudo hostnamectl set-hostname newNameHere 2. 修改配置文件使hostname可以保存编辑这个文件: /etc/cloud/cl ...
- HIT Software Construction Lab 2
2019年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录 1 实验目标概 ...
- ChildViewController
View Controller中可以添加多个sub view,在需要的时候显示出来: 可以通过viewController(parent)中可以添加多个child viewController;来控制 ...
- Unity类继承关系 图
UnityEngine(命名空间) 其他命名空间 其他类 Object(类) 其他类(继承自Object) Component(类)(继承自Object) 其他类(继承自Component) Tran ...
- CorelDRAW 2018新增功能介绍
2018年4月11日,CorelDRAW 2018正式对外发布,最新版设计软件包已经过全面更新,是近几年来发行的最强大版本,可协助绘图专业人士将创意转换为令人惊艳的专业视觉设计.CorelDRAW 2 ...
- Python-ORM实战
Date: 2019-06-03 Author: Sun 什么是ORM? ORM(object relational mapping), 就是对象关系映射,简单来说我们类似python这种面向对象 ...
- jupyter的安装
3.6:\Lib\site-packages\pip\models\index.py # PyPI = Index('https://pypi.python.org/') # 替换成 PyPI = I ...
- VUE:条件渲染和列表渲染
条件渲染 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...