vector内部的实现1
写vector的内部方法
#include<vector>
using std::vector;
//写一个动态内存 class CA{
int a;
public:
CA(int i){ i = a; }
CA();
};
template <class T>
class CStack
{
T pBuff[];
public:
CStack();
~CStack();
void push(T const& val);//入栈
void pop();//出栈
T GetTop();//得到栈顶的元素
};
template <class T>
void CStack<T>::pop()
{
top--;
} template <class T>
CStack<T>::CStack()
{
top = ;
} template <class T>
void CStack<T>::push(T const& val)
{
pBuff[top++] = val;
}
int main()
{
CA a();//调用带参构造
CA pa[];//调用默认构造 数组不可以用带参构造来构造
CA *pa1 = new CA;//调用默认构造 return ;
}
写一个字节的类对自己的类进行加工封装函数 实现vector内部封装的效果 进而实现所需要的内容
#pragma once
template<typename T>
class Myvector
{
T *pBuff;//给一个指针用来指向以恶个动态内存
unsigned int len;//给一个长度 表示这个内存中的元素个数
size_t maxSize;//存放这个动态数组的内存空间的大小
public:
Myvector();//默认构造
Myvector(int n);//有n个T的默认构造对象 构造进这个容器
Myvector(int n,T const& elem);//用n个elem对象 构造进这个容器
Myvector(Myvector const& other);//深拷贝
//Myvector(); ~Myvector();//析构函数 释放所有的对象 也会将变量删除(堆内存和栈内存)
void clear();//清除 (删除堆内存里数据)
public:
size_t size() const;
size_t capacit() const;//返回容器代下
bool empty() const;//判断容器是否为空
public:
bool operator==(Myvector const& srcVector) const;//运算符重载==
bool operator!=(Myvector const& srcVector) const; //重载运算符!=
public:
void assgin(int n, T const& elem);//赋值
void swap(Myvector & srcVerctor);//交换
public:
T at(int index);//返回动态数组下标为index的元素 是c++中唯一会主动抛异常的函数
T operator[](int index);//重载[]运算符
T front();//得到容器中的第一个元素,不管容器为不为空
T back();
public:
void push_back(T const& elem);//往动态数组的 尾部添加数字
};
template<typename T>
void Myvector<T>::Myvector()//无参构造
{
pBuff = nullptr;
len = ;
maxSize = ;
} template<typename T>
void Myvector<T>::~Myvector()//析构函数 清除对象
{
clear();//调用clear函数 重复代码通过封装函数来提高代码的效率
}
template<typename T>
void Myvector<T>::clear
{
if (pBuff != nullptr)
{
delete[] pBuff;
pBuff = nullptr;
len = ;
maxSize = ;
}
}
template<typename T>
void Myvector<T>::Myvector(int n)//n个有T的默认构造的构造对象 构造进这个容器
{//n个对象构造这个容器
if (n < )
{
pBuff = nullptr;
len = ;
maxSize = ;
}
else
{
len = maxSize = n;
pBuff = new T[maxSize];
}
} template<typename T>
void Myvector<T>::Myvector(int n, T const& elem)//用n个elem对象来构造这个容器 &来增加传递效率
{
if (n < )
{
pBuff = nullptr;
len = ;
maxSize = ;
}
else
{
len = maxSize = n;
pBuff[i] = new T[maxSize];
for (size_t i = ; i < len; ++i)//size_t无符号的int
{
pBuff[i] = elem;
}
}
}
template<typename T>
void Myvector<T>::Myvector(Myvector const& other)
{
len = other.len;
maxSize = other.maxSize;
pBuff = nullptr;
if (len > )
{
pBuff = new T[maxSize];
for (int i = ; i < len; ++i)
pBuff[i] = other.pBuff[i];
}
}
template<typename T>
size_t Myvector<T>::size() const//返回容器的长度
{
return len;
}
template<typename T>
size_t Myvector<T>::capacity() const//返回容器大小
{
return maxSize;
}
template<typename T>
bool Myvector<T>::empty() const//判断容器是否为空
{
//return pBuff == nullptr;泵使用这一种 这一种判定存不存在
return len == ;//是否为0 0是空的
}
template<typename T>
bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
{
if (len != srcVector.len)//长度不等
return false;
for (size_t i = ; i < len; ++i)//遍历判定内容是否相等
{
if (pBuff[i] != srcVector.pBuff[i])
return false;
}
return true;
}
template<typename T>
bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
{
return !(*this == srcVector);
}
template<typename T>
void Myvector<T>::assign(int n, T const& elem)//和带参构造类似 对容器进行赋值
{
clear();//重点:清除自身可能原有的动态内存
if (n > )
{
len = maxSize = n;
pBuff = new T[maxSize];
for (size_t i = ; i < len; ++i)
pBuff[i] = elem;
}
} void Myvector<T>::swap(Myvector & srcVector)
{
T *tempBuff = pBuff;
size_t tempLen = len;
size_t tempMaxSize = maxSize;//定义三个变量 pBuff = srcVector.pBuff;
len = srcVector.len;
maxSize = srcVector.maxSize;//数据的交换 srcVector.pBuff = tempBuff;
srcVector.len = tempLen;
srcVector.maxSize = tempMaxSize;
}
template<typename T>
T CMyVector<T>::at(int index)//唯一的会主动抛异常的函数
{
if (index < || index >= len)
throw "out_of_range";//防止越界 抛异常
return pBuff[index];
} template<typename T>
T CMyVector<T>::operator[](int index)//这个应该出错就出错 无法出来 按照给的要求来
{
return pBuff[index];
}
template<typename T>
T Myvector<T>::back()
{
return pBuff[len - ];
} template<typename T>
T Myvector<T>::front()
{
return pBuff[];
} template<typename T>
T Myvector<T>::operator[](int index)
{
return pBuff[index];
}
template<typename T>
void Myvector<T>::push_back(T const& elem)
{
//1 2 3 4 6 9 13 19
if (len >= maxSize)
{
maxSize = maxSize + ((maxSize >> ) > ? (maxSize >> ) : );
T *tempBuff = new T[maxSize];
for (size_t i = ; i < len; ++i)
tempBuff[i] = pBuff[i];
if (pBuff != nullptr)
delete[] pBuff;
pBuff = tempBuff;
}
pBuff[len++] = elem;
}
vector内部的实现1的更多相关文章
- vector内部实现2
push_back 往动态数组的内部进行添加数据 pop_back 往动态数组的尾部进行删除数据 resize 讲元素的数量len改成num个数量 如果size()变大了,多出来的将用默认构造来创 ...
- vector 内部方法大全 学习(初学者的参考资料)
1 vector构造函数:也就是如何对一个vector对象进行初始化 ////////////////////////////代码//////////////////////////////// ...
- STL学习之vector
vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像指针一样被操作,由于它的特性我们完全可以将vector看做动态数组. 特点: 1.指定一块如同数组一样的连续存 ...
- 如何线程安全地遍历List:Vector、CopyOnWriteArrayList
遍历List的多种方式 在讲如何线程安全地遍历List之前,先看看通常我们遍历一个List会采用哪些方式. 方式一: for(int i = 0; i < list.size(); i++) { ...
- C++ 序列式容器之vector
什么是容器 容器,顾名思义,是用来容放东西的场所.C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的.众所周知,常用的数据结构不外乎:数组array, 链表list, 树tree ...
- C++ STL,list vector区别
顺序性容器: 向量 vector : 是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组.在创建一个 ...
- Vector[C++]
// vector<int> vec; // for(int i = 0; i < 10; i++) // { // vec.push_back(5) ...
- C++ Daily《2》----vector容器的resize 与 reserve的区别
C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...
- [转]STL中vector转数组(实际是数组的指针)
感谢:http://topic.csdn.net/t/20050429/20/3976956.html 感谢:http://yzyanchao.blogbus.com/logs/47796444.ht ...
随机推荐
- ELK 安装Beat
章节 ELK 介绍 ELK 安装Elasticsearch ELK 安装Kibana ELK 安装Beat ELK 安装Logstash Beat是数据采集工具,安装在服务器上,将采集到的数据发送给E ...
- Linux学习《第二章命令》本章小结
经过这一章的学习,了解了常用的命令.这是学习Linux系统最最基础的工作,必须努力掌握,个人觉得,并不是这个章节学习结束之后,命令的学习就结束了,而是刚刚开始,今后在每个知识点学习过程中,都会 学习到 ...
- UVA - 11105 Semi-prime H-numbers(H-半素数)
题意:所有形如4n+1(n为非负整数)的数叫H数.定义1是唯一的单位H数,H素数是指本身不是1,且不能写成两个不是1的H数的乘积.H-半素数是指能写成两个H素数的乘积的H数(这两个数可以相同也可以不同 ...
- sqlserver 联接查询的一些注意点
1.内连接的安全性 (1) inner join 是ANSI SQL-92 语法.等值联接是ANSI SQL-89 的语法 ,两者已相同方式解释.在性能上没有差别 (2)但是强烈建议使用ANSI SQ ...
- zabbix_agent_win
http://mayulin.blog.51cto.com/1628315/514447/ http://www.cnblogs.com/likehua/p/3968689.html 先下载win客户 ...
- FreeImage库的学习和使用
1.FreeImage_SetPixelColor x横轴方向 y纵轴方向 左下角是(0, 0)
- SourceTree - 对Git的使用
SourceTree - 对Git的使用 一 .SourceTree简介 SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作 ...
- bugku-Web这是一个神奇的登陆框(sqlmap+bp)
根据url提示是让sql注入,但万能密码又无效,这里我们用sqlmap+bp来解题. 首先输入用户密码来登录用bp抓包: 如图将其保存到txt文件中,然后用SQLmap来注入 输入命令暴库:sqlma ...
- 关于GAN的一些笔记
目录 1 Divergence 1.1 Kullback–Leibler divergence 1.2 Jensen–Shannon divergence 1.3 Wasserstein distan ...
- SASS - @extend(继承)指令
SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...