简单重写容器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中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
随机推荐
- windows 匿名管道: 父进程与子进程通信 (进程间通信之CreatePipe)
看了很多篇相关的资料,感觉这个还是比较靠谱的: 进程间通信之CreatePipe https://blog.csdn.net/dacxu/article/details/30071081 特别是 ...
- 关于 vscode 格式化自己的代码 使用shift+alt+f
关于 vscode 格式化自己的代码 使用shift+alt+f,这样就好了
- [NOI2017]游戏(2-SAT)
这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...
- 【译】6. Java反射——Getter和Setter
原文地址:http://tutorials.jenkov.com/java-reflection/getters-setters.html ============================== ...
- request鉴权的处理和判断
一般查看蝉道bug管理工具bug列表的时候,会提示 Unauthorized access,那是因为需要用户名和密码,一般用基本的认证,代码如下: 不是所有的系统都是开放的,有些人是不可以访问的,所 ...
- 遍历List过程中同时修改
public static void Main() { List<int> list = new List<int>(); ,,,,,,,,,}; list.AddRange( ...
- curl与wget
curl 和wget 区别 使用方法 可参考 curl vs Wget 1.curl是libcurl这个库支持的,wget是一个纯粹的命令行命令.2.curl支持更多的协议.curl supports ...
- oracle 12C版本的下载安装
首先 去官网下载自己需要的oracle对应的操作系统的版本 接受协议后可下载 1 下载解压好后 进入主目录 进行安装 在配置安全更新中把我希望通过My Oracle Support接收安全更新前面的 ...
- 给笔记本更换SSD硬盘
给笔记本更换SSD硬盘... ---------- 给笔记本更换SSD硬盘 带活动字样的一个新的系统盘,一个之前的主分区的系统盘 ----------------------------
- 剑指Offer_编程题_6
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...