简单重写容器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中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
随机推荐
- 面试篇——mysql
背景:在面试过程中发现很多公司对sql查询有要求,虽然不高,但是简单常见的sql查询必须熟练的掌握,否则一面都无法通过,痛定思痛,必须要深入了解下!!! 注释符号 面试题1 查询没有成绩的学生信息 参 ...
- django 通过ajax完成登录
一. 在users/views.py中加代码: from django.http import HttpResponse class LoginView(View): ""&quo ...
- Deepin或者Ubuntu上永久配件navicat
1.深度商店下载安装Navicat,期间可能会要求安装wine等. 2.安装完毕 终端环境下找到Navicat的安装目录 langzi@langzi-PC:~$ whereis ...
- 基本类型(2):oracle中有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。
1)blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据库中. 2)clob:字符lob,字符数据,最长可以达到4GB,存贮在数据库中. 3)bfile:二进制文件;存贮在数据库之外的只读 ...
- JSON语法、对象、遍历数组的区别和基本操作
JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是: ...
- 2017-12-15python全栈9期第二天第三节之使用while循环输出0到10
#!/user/bin/python# -*- coding:utf-8 -*-count = 0while count < 10: count += 1 print(count)
- python第四次周末大作业
''' 选课系统开发 系统登录需要有两类用户:学生.管理员,针对不用用户提供不同功能: 学生用户 :对于学生用户来说,登陆之后有三个功能 1.查看所有课程 2.选择课程 3.查看所选课程 4.删除已选 ...
- python 列表 元祖 集合
#####################概念#######################1,什么是列表: 列表由[]表示,里面每一项元素用逗号隔开,里面什么都可以装.能装对象的对象. 列表可以装大 ...
- [NIO-3]Socket通道
Socket通道 上文讲述了通道.文件通道,这篇文章来讲述一下Socket通道,Socket通道与文件通道有着不一样的特征,分三点说: 1.NIO的Socket通道类可以运行于非阻塞模式并且是可选择的 ...
- CSS-With-BEM
Naming rules block_name__element_name--modifier_name-modifier_value Names are written in lowercase L ...