简单重写容器vector
#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的更多相关文章
- C++线性序列容器<vector>简单总结
C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...
- 2.1实现简单基础的vector
2.1实现简单基础的vector 1.设计API 我们参考下C++ <std> 库中的vector, vector中的api很多,所以我们把里面用的频率很高的函数实现; 1.1 new&a ...
- 2.2 C语言_实现数据容器vector(排序功能)
上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...
- 理解与模拟一个简单servlet容器
servlet接口 使用servlet编程需要实现或者继承实现了javax.servlet.Servlet接口的类,其中定义了5个签名方法: public void init(ServletConfi ...
- [C++]STL容器Vector的内存释放
直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...
- JavaScript简单重写构造器的原型
//简单重写原型对象: //一个构造函数Person function Person(){ } //重写Person的原型 //把Person的原型赋值给一个新的对象 是我们重写的过程 Person. ...
- STL标准库-容器-vector
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...
- 从零开始写STL—容器—vector
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
随机推荐
- python基础之FTP
目的:实现客户端到服务器的上传功能 所需文件夹: 客户端是FTP_client 服务端是FTP_server bin文件存放执行文件,conf下存放配置文件,core下是核心文 ...
- POJ 3713 Transferring Sylla (三联通分量)
Transferring Sylla Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3533 Accepted: 988 ...
- PHP的简单工厂模式
又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建 ...
- curl 出现错误的调试方法
private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, tru ...
- Python list 初始化技巧
1.一维列表 1.1 递增列表 # 初始化递增的list,与L = [i for i in range(10)] 效果相同 L = range(10) # 版本变化L = i for i in ran ...
- 全角的空格(A1A1)惹的祸!
#先上干货 “A1A1”是指全角的空格(GBK码): #验证 由上图可以看出半角的空格的HEX为"20": 由上图可以看出,在ANSI格式编码的文件中输入的全角的空格,转换为HEX ...
- python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)
###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位 线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...
- python第二次周末大作业
题目 ''' HR人力资源管理. 1. 菜单: ("查看员⼯信息","添加员⼯信息", "修改员⼯信息", "删除员⼯信息&quo ...
- Java笔记——泛型擦除
1. 泛型擦除 package cn.Douzi.T_Demo; import java.util.ArrayList; /** * @Auther: Douzi * @Date: 2019/3/8 ...
- Spark源码剖析 - 计算引擎
本章导读 RDD作为Spark对各种数据计算模型的统一抽象,被用于迭代计算过程以及任务输出结果的缓存读写.在所有MapReduce框架中,shuffle是连接map任务和reduce任务的桥梁.map ...