简单重写容器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中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
随机推荐
- Ubuntu的 g++ gcc版本升降级
更改gcc默认版本(gcc版本降级/升级) ### 以降级到gcc-6为例 >* sudo apt install gcc-6 g++-6 >* sudo update-alternati ...
- 安装Redis 4.0单实例
一.Redis简单介绍 转载于网络 Redis是一个开源(BSD许可)的内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.由于Redis采用运行在内存中的数据集工作方式,其性能卓越,能支持 ...
- JDBC工具类
package com.shundong.uitl; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...
- golang rpc介绍
rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问.服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名.注册之后,对象的导出方法就可以被远程访问.服务端可以注册多个不 ...
- django 跨域解决方案
使用django-cors-headers模块 github:https://github.com/ottoyiu/django-cors-headers 官方文档中有详细说明 简要配置 1.安装 p ...
- 正态分布-python建模
sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...
- Linux shell 自动删除n天前日志
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- JAVA核心技术I---JAVA基础知识(映射Map)
一:映射Map分类 二:Hashtable(同步,慢,数据量小) –K-V对,K和V都不允许为null –同步,多线程安全 –无序的 –适合小数据量 –主要方法:clear, contains/con ...
- UVA - 11732 "strcmp()" Anyone? (trie)
https://vjudge.net/problem/UVA-11732 题意 给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. strcmp函数的实现 int strcmp(cha ...
- bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...