#pragma once
#include <iostream>
using namespace std; template<class T>
class CMyVector
{
public:
CMyVector() { buff = NULL; len = maxSize = ; }
~CMyVector() { _clear(); }
size_t capacity();
size_t size();
bool empty();
void print();
//迭代器
struct MyIterator
{
T* pt;
MyIterator() { pt = NULL; }
MyIterator(MyIterator& it) { pt = it.pt; }
~MyIterator() { pt = NULL; }
MyIterator operator=(const MyIterator& it) {
pt = it.pt;
return *this;
}
bool operator!=(const MyIterator& it) {
return (pt != it.pt);
}
T operator*() {
return (*pt);
}
MyIterator& operator++() {
++pt;
return *this;
}
MyIterator operator++(int) {
MyIterator tmp = *this;
++pt;
return tmp;
}
MyIterator operator+(int n)const {
MyIterator tmp;
tmp.pt = pt + n;
return tmp;
}
int operator-(const MyIterator& it)const {
return (pt - it.pt);
}
MyIterator operator-(int n) {
MyIterator tmp;
tmp.pt = pt - n;
return tmp;
};
}; MyIterator begin()
{
MyIterator tmp;
tmp.pt = buff + ;
return tmp;
}
MyIterator end()
{
MyIterator tmp;
tmp.pt = buff + len;
return tmp;
} T operator[](size_t pos) {
return *(buff + pos);
} void push_back(T t);
void insert(const MyIterator& it, T t);
void insert(const MyIterator& it, const MyIterator& first, const MyIterator& last);
void assign(const MyIterator& first, const MyIterator& last);
T at(size_t pos);
private:
T* buff;
size_t len;
size_t maxSize; void _clear();
}; template<class T>
void CMyVector<T>::push_back(T t)
{
if (len >= maxSize)
{
maxSize += ((maxSize >> ) > ) ? (maxSize >> ) : ;
T* tmp = new T[maxSize];
if (buff)
{
memcpy(tmp, buff, sizeof(T)*len);
delete[] buff;
}
buff = tmp;
}
buff[len++] = t;
} template<class T>
void CMyVector<T>::insert(const MyIterator& it, T t)
{
int pos = it - begin();
if (pos > (int)len)
return; if (len >= maxSize)
maxSize += ((maxSize >> ) > ) ? (maxSize >> ) : ; T* tmp = new T[maxSize];
if (buff) {
memcpy(tmp, buff, sizeof(T)*pos);
tmp[pos] = t;
memcpy(tmp + pos + , buff + pos, sizeof(T)*(len - pos));
delete[] buff;
}
else
tmp[pos] = t;
buff = tmp;
++len;
} template<class T>
void CMyVector<T>::insert(const MyIterator& it, const MyIterator& first, const MyIterator& last)
{
int pos = it - begin();
if (pos > (int)len)
return; int count = ;
if ((count = last - first) <= )
return; while ((len + count) >= maxSize)
maxSize += ((maxSize >> ) > ) ? (maxSize >> ) : ; T* tmp = new T[maxSize];
if (buff) {
memcpy(tmp, buff, sizeof(T)*pos);
for (int i = ; i < count; ++i)
tmp[pos + i] = *(first + i); memcpy(tmp + pos + count, buff + pos, sizeof(T)*(len - pos));
delete[] buff;
}
else
for (int i = ; i < count; ++i)
tmp[pos + i] = *(first + i); buff = tmp;
len += count; } template<class T>
void CMyVector<T>::assign(const MyIterator& first, const MyIterator& last)
{
_clear();
insert(begin(), first, last);
} template<class T>
T CMyVector<T>::at(size_t pos)
{
return *(buff + pos);
} template<class T>
void CMyVector<T>::_clear()
{
if (buff)
delete[] buff; buff = NULL;
len = maxSize = ;
} template<class T>
size_t CMyVector<T>::capacity()
{
return maxSize;
} template<class T>
size_t CMyVector<T>::size()
{
return len;
} template<class T>
bool CMyVector<T>::empty()
{
return (len == );
} template<class T>
void CMyVector<T>::print()
{
/*CMyVector<T>::MyIterator it;
it = begin();
while(it != end())
cout << *it++ << " ";*/
for (auto it = begin(); it != end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}

简单重写容器vector的更多相关文章

  1. C++线性序列容器<vector>简单总结

    C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...

  2. 2.1实现简单基础的vector

    2.1实现简单基础的vector 1.设计API 我们参考下C++ <std> 库中的vector, vector中的api很多,所以我们把里面用的频率很高的函数实现; 1.1 new&a ...

  3. 2.2 C语言_实现数据容器vector(排序功能)

    上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...

  4. 理解与模拟一个简单servlet容器

    servlet接口 使用servlet编程需要实现或者继承实现了javax.servlet.Servlet接口的类,其中定义了5个签名方法: public void init(ServletConfi ...

  5. [C++]STL容器Vector的内存释放

    直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...

  6. JavaScript简单重写构造器的原型

    //简单重写原型对象: //一个构造函数Person function Person(){ } //重写Person的原型 //把Person的原型赋值给一个新的对象 是我们重写的过程 Person. ...

  7. STL标准库-容器-vector

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...

  8. C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...

  9. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

随机推荐

  1. 64位win8.1系统 运行 32位程序,文件夹路径是中文遇到问题

    今天有一位用户向我反应软件使用遇到问题. 用户使用的是64位win8.1系统,之前有很多用户使用64位的win8.1系统没遇到过问题. 远程协助了一下,差不多15分钟我试了几个办法没解决问题. 最后我 ...

  2. 第三篇-Django建立数据库各表之间的联系(下)

    中篇介绍的是添加,下篇主要介绍查询 通过一个Book表的书的信息查询Publish表中出版社的信息 def addbook(request): # Book.objects.create(name=& ...

  3. 安卓手机root

    https://jingyan.baidu.com/article/ca41422ffe6b031eae99ed9a.html

  4. Windows7安装程序无法定位现有系统分区,也无法创建新的系统分区

    解决Windows7.Windows8系统安装时“安装程序无法定位现有系统分区,也无法创建新的系统分区”提示. 方法一 把Windows7镜像发在你电脑的非系统盘的其他硬盘上. 重启机器,通过U盘启动 ...

  5. 【清北学堂2018-刷题冲刺】Contest 5

     这三个题写了一天半,第一个题写了大概一整天.出题人劝我从后往前写,我不听,结果T1想了+调了一天QWQWQ Task 1:序列 [问题描述]  定义一个"好的序列"为一个长度为M ...

  6. qml: 自定义按钮-- 仿QML自带控件;

    import QtQuick 2.0 Rectangle { id: btn; width:; height:; radius:; border.color: "#A3A3A3"; ...

  7. Java流程控制语句和数组整理

    7.1选择结构switch switch (表达式){ case 目标值1: 执行语句1 break; case 目标值2: 执行语句2 break; ...... case 目标值n: 执行语句n ...

  8. Linux报错

    Linux报错 ------------------- 在VMware虚拟机中配置yum源时,执行 mount /dev/cdrom /mnt/cdrom 出现 mount: no medium fo ...

  9. angular中的服务

    angular中的服务 angular中的服务相当于一个状态管理,可以将数据放在服务里面进行获取以及编辑. 服务的安装命令: ng g service count 安装好后,会在服务的ts文件中引入一 ...

  10. [JUC-1]并发包实现及线程状态

    一.Java 并发包实现 二.Java 线程状态转换图