push_back 往动态数组的内部进行添加数据

pop_back 往动态数组的尾部进行删除数据

resize  讲元素的数量len改成num个数量  如果size()变大了,多出来的将用默认构造来创建

assert(nullptr);断言函数 可以解决出错问题 和return,throw相似 进行处理异常数据

reserve(int n);如果容器的容量不足扩大容量

maxSize=maxSize+(maxSize>>1)>1?(maxSize>>1):1)  内存不够会发生内存重分配 把原来的内存数据拷贝到新的内存中去

1 2 3 4 6 9 13 19

vector<int>::iterator vit;容器的迭代器

迭代器 是用来遍历容器中部分或者全部容器的对象

结构和类的区分 访问权限不是主要的区分方式 对象中有接口用类 对象里面没有接口就用结构 迭代器用结构来模拟

.h文件不参与编译 只是一个工具

end和begin是指向vertor里面容器的开始和结尾 insert和erase是插入和删除

自己模拟的动态数组在元素删除时不会有内存重分配,但是系统vector在删除时候回导致内存重分配

具体内容由下面实现

 #pragma once
template<typename T>
class Myvector
{
T *pBuff;//给一个指针用来指向以恶个动态内存
unsigned int len;//给一个长度 表示这个内存中的元素个数
size_t maxSize;//存放这个动态数组的内存空间的大小
public:
struct MyIterator//这个结构也是一个模板 一个模板内部嵌套定义了一个末班
{
T *pIt;
MyIterator & operator = (MyIterator const& srcIt)
{
pIt=srcIt.pIt;
return *this;
}
bool operator!=(MyIterator const& srcIt) const
{
return pIt!=srcIt.pIt;
}
MyIterator & operator ++ ()//前置
{
pIt++;
return *this;
}
MyIterator operator++ (int)//后置++
{
MyIterator tempIt=*this;
pIt++;
return tempIt;
}
T &operator*()
{
return *pIt;
}
T &operator-(MyIterator const& scrIt)const
{
return pIt-scrIt.pIt;
}
MyIterator operator +(int n)
{
MyIterator tempIt = *this;
tempIt.pIt+=n;
return tempIt;
}
};
public:
MyIterator begin()//得到容器的第一个位置
{
MyIterator tempIt;
tempIt.pIt=pBuff;
return templt;
}
MyIterator end()//得到容器的最后一个元素的下一个位置
{
MyIterator tempIt;
tempIt.pIt=pBuff+len;
return tempIt;
}
public:
MyIterator insert(MyIterator const& pos,MyIterator const& firstMyIterator const& second)//插入,在pos处插入n个elem元素
{
MyIterator tempIt=pos;
int n=second-first;
for(int i=o;i<n;i++)
tempIt=insett(templt,*(first+i));//在insert里面调用重载的另一个insert
return tempIt;
}
MyIterator insert(MyIterator const& pos,int n,T const& elem)//插入,在pos处插入n个elem元素
{
MyIterator tempIt=pos;
for(int i=o;i<n;i++)
tempIt=insett(templt,elem);//在insert里面调用重载的另一个insert
return tempIt;
}
MyIterator insert(MyIterator const& pos,T const& elem)//插入,在pos这个股迭代器所指的位置插入一个elem元素
{
int index=pos.pIt-pBuff;//通过迭代器位置和容器的首地址进行相减 得到当前的下标
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;
}
//移位操作
for(size_t i=len;i>index;--i)
{
pBuff[i]=pBuff[i-];
}
pBuff[index]=elem;
len++;
Myterator tempIt;
tempIt.pIt=pBuff+index;
return tempIt;
}
//注意:自己模拟的动态数组在元素删除时不会有内存重分配,但是系统vector在删除时候回导致内存重分配
MyIterator erase(MyIterator const& pos)//删除代码
{
int index=pos.pIt-pBuff;
for(sieze_t i=index;i<len-;i++)
{
pBuff[i]=pBuff[i+];
}
len--;
Myterator tempIt;
tempIt.pIt=pBuff+index;
return tempIt;
}
MyIterator erase(MyIterator const& firstMyIterator const& second)
{
int n=second-first;
MyIterator tempIt=first;
for(int i=;i<n;++i)
{
tempIt=erase(tempIt);
return tempIt;
}
}
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);//往动态数组的 尾部添加数字
void pop_back(); //往动态数组的尾部进行删除数据
public:
void resize(int num);//讲元素的数量len改成num个数量 如果size()变大了,多出来的将用默认构造来创建
void resize(int num,const& elem);//resize的重载
void reserve(int num);//如果容器的容量不足扩大容量
}; 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;
}
}
template<typename T>
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;
}
template<typename T>
void Myvector<T>::pop_back()
{
--len;
}
template<typename T>
void Myvector<T>::resize(int num)
{
if(num<)
{
//return;throw
assert(nullptr);//断言函数
}
if(num>len)//num超出扩张空间的时候 通过扩张len的长度 来进行对num的保存
{
while(num>=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;
}
len=num;
}
template<typename T>
void Myvector<T>::resize(int num,T const& elem)
{
if(num<)
{
//return;throw
assert(nullptr);//断言函数
}
if(num>len)//num超出扩张空间的时候 通过扩张len的长度 来进行对num的保存
{
while(num>=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;
for(size_t i=len;i<num;++i)
pBuff[i]=elem;
}
len=num;
}
template<typename T>
void Myvector<T>::reserve(int num)
{
if(num>maxSize)
{
maxSize=num;
T* tempBuff=new T[maxSize];
for(size_t i=;i<len;++i)
tempBuff[i]=pBuff[i];
if(pBuff!=nullptr)
delete[] pBuff;
pBuff=tempBuff;
}

主函数实现头文件中一些函数的算法

 #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;//调用默认构造 vector<int> v;
vector<int>::iterator vit;//迭代器
for(vit=v.begin();vit!=v.end();++vit)
{
printf("%d\n",*vit);
} return ;
}

vector内部实现2的更多相关文章

  1. vector内部的实现1

    写vector的内部方法 #include<vector> using std::vector; //写一个动态内存 class CA{ int a; public: CA(int i){ ...

  2. vector 内部方法大全 学习(初学者的参考资料)

    1    vector构造函数:也就是如何对一个vector对象进行初始化 ////////////////////////////代码//////////////////////////////// ...

  3. STL学习之vector

    vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像指针一样被操作,由于它的特性我们完全可以将vector看做动态数组. 特点: 1.指定一块如同数组一样的连续存 ...

  4. 如何线程安全地遍历List:Vector、CopyOnWriteArrayList

    遍历List的多种方式 在讲如何线程安全地遍历List之前,先看看通常我们遍历一个List会采用哪些方式. 方式一: for(int i = 0; i < list.size(); i++) { ...

  5. C++ 序列式容器之vector

     什么是容器 容器,顾名思义,是用来容放东西的场所.C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的.众所周知,常用的数据结构不外乎:数组array,  链表list,  树tree ...

  6. C++ STL,list vector区别

    顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组.在创建一个 ...

  7. Vector[C++]

    //    vector<int> vec; //    for(int i = 0; i < 10; i++) //    { //        vec.push_back(5) ...

  8. C++ Daily《2》----vector容器的resize 与 reserve的区别

    C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...

  9. [转]STL中vector转数组(实际是数组的指针)

    感谢:http://topic.csdn.net/t/20050429/20/3976956.html 感谢:http://yzyanchao.blogbus.com/logs/47796444.ht ...

随机推荐

  1. 如何通过模仿提升Paper写作能力?

    对于大部分初到国外留学的中国留学生们来说要想自己独立完成一篇Paper可能难度会很大,从Paper字体字号要求.Paper写作格式.Paper写作结构等等诸多因素都会影响留学生们写Paper的效率.对 ...

  2. Spring 事件(2)- 自定义事件

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  3. Bulma CSS - CSS类

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是一 ...

  4. Atom :奥特曼的使用

    最近在使用atom的编译器,很不爽,什么快捷键,还有识别vue的页面,还有注释这种快捷下载下来的都没有 必须到setting里面的install里下载,我能大声的说我很不爽吗............ ...

  5. C# 使用复选框实现循环添加多条信息入库!

    先在前台获取到所有要添加信息的Id $('.imgid').each(function () {                     if ($(this).attr("src" ...

  6. 1.求子集,2.动态创建action

    功能待完善 #ifndef MYMAINWINDOW_H #define MYMAINWINDOW_H #include <QMainWindow> #include <QTable ...

  7. 每天一点点之 taro 框架开发 - taro路由及传参

    1.路由 taro的路由是自带的,不需要我们额外配置,只需要我们在app.js下config中配置pages即可 class App extends Component { config = { pa ...

  8. HDU 5464:Clarke and problem

    Clarke and problem  Accepts: 130  Submissions: 781  Time Limit: 2000/1000 MS (Java/Others)  Memory L ...

  9. python 列表和字符串

    python 列表中保留所有字符串前三项,并保存到一个新的列表l = [s[:3] for s in data] python 在列表中查找包含所以某个字符串的项,并保存到一个新的列表l = [s f ...

  10. 【LeetCode】两个数相加

    [问题]给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. [实例] 输入: ...