模拟实现vector容器
来源:互联网 发布:情感分类 贝叶斯算法 编辑:程序博客网 时间:2024/05/16 17:04
vector:
模型结构:
以上表示3个指针,分别指向不同的位置;
Vector的缺陷:前期增长代价太大,以1/2的模式开增,eg:1,2,3,4,6,6,9,9,9。。。
改进方法:使用reverse(x)直接开辟一个较大空间即可;
Vector中两种增容方式:
① resize(x,y) //会改变size()大小,会让容量变大或者不变
分三种情况:
a.X > capacity :增容会使capacity变大
b.X < size() :增容会改变size()大小
c.size() <= X <= capacity :增容不会改变size(),capacity的大小
② reserve(x) //会改变容量大小,不会改变size()大小
(x表示增容的大小,y表示增容后的内容用什么来初始化)
//#include"TypeTraits_re.h"文件//特化必须出现在原生类型以后struct _FalseType//非内置类型{};struct _TrueType//是内置类型{};//原生类型template <class T>struct TypeTraits{ typedef _TrueType _IsPodType;};//全特化template<>struct TypeTraits<int>{ typedef _TrueType _IsPodType;};template<>struct TypeTraits<char>{ typedef _TrueType _IsPodType;};template <class T>struct TypeTraits<T*>{ typedef _TrueType _IsPodType;};//模板函数//内置类型的复制template <class T>void _Copy(T* dst, T* src, size_t n, _TrueType){ memcpy(dst,src,n*sizeof(T));}//自定义类型的复制template <class T>void _Copy(T* dst, T* src, size_t n, _FalseType){ for(size_t i = 0; i < n; i++) { dst[i] = src[i]; }}template <class T>void Copy(T* dst, T* src, size_t n){ _Copy(dst,src,n,TypeTraits<T>::_IsPodType());//里面类型的小括号不能省略哦}#include"TypeTraits_re.h"#include<string.h>template <class T>class Vector{public: typedef T* Iterator; typedef const T* ConstIterator;protected: Iterator _start; Iterator _finish; Iterator _endOfStorage;public: //指针初始化可以赋为零,赋零和赋NULL是一样的 Vector() :_start(NULL),_finish(NULL),_endOfStorage(NULL) {} //拷贝构造函数 Vector(Vector<T>& v) :_start(NULL),_finish(NULL),_endOfStorage(NULL) { Expand(v.GetSize()); /*Reserve(v.GetSize());*/ /* Resize(v.GetSize());*/ Copy(_start,v.Begin(),v.GetSize()); _finish = _endOfStorage = _start + v.GetSize(); } ~Vector()//析构函数 { if(_start) { delete[] _start; } _start = _finish = _endOfStorage; } size_t GetSize()//获取实际大小值 { return _finish - _start; } size_t GetCapacity()//获取实际容量值 { return _endOfStorage - _start; } void Resize(const size_t& n,const T& val = T()) { //增容有三种情况 //1.大于总容量;2.小于实际值;3.大于实际值小于总容量 if(n > GetCapacity()) { Expand(n); Iterator pos = _finish; while(pos != _start + n) { *pos = val; ++pos; } } else if(n < GetSize()) { Iterator pos = _start + n; while(pos != _finish) { pos->~T(); ++pos; } _finish = _start + n; } else { Iterator pos = _finish; Iterator end = _start + n; while(pos != end) { *pos = val; pos++; } } } void Reserve(const size_t& n) { Expand(n); } void Expand(size_t capacity) { if(capacity < GetCapacity()) return; size_t n = GetSize(); T* tmp = new T[capacity]; Copy(tmp,_start,GetSize()); _start = tmp; _finish = _start + n; _endOfStorage = _start + capacity; } void CheckCapacity() { if(_finish >= _endOfStorage) { //增容 size_t n = GetSize(); size_t capacity = GetCapacity(); capacity = capacity + capacity/2; if(capacity < n + 1) { capacity = n + 1; } //扩容 //分为两种情况,一种是内置类型,一种是自定义类型 Expand(capacity); } } void pushBack(const T& data)//后插 { //判断是否需要扩容 CheckCapacity(); *_finish = data; ++_finish; } void show() { size_t n = GetSize(); for(size_t i = 0; i < n; i++) { cout<<_start[i]<<" "; } cout<<endl; } //迭代器-----类型指针 Iterator Begin() { return _start; } Iterator End() { return _finish; } ConstIterator Begin() const { return _start; } ConstIterator End() const { return _finish; } T& operator[](const size_t& n) { assert(n < GetSize()); return _start[n]; } const T& operator[](const size_t& n) const { assert(n < GetSize()); return _start[n]; }};template <class T>void printVector(Vector<T>& v){ Vector<T>::Iterator it = v.Begin(); while(it != v.End()) { cout<<*it<<" "; ++it; } cout<<endl; cout<<"capacity: "<<v.GetCapacity()<<endl; cout<<"size: "<<v.GetSize()<<endl; /*for(size_t i = 0; i < v.GetSize(); i++) { cout<<v[i]<<" "; } cout<<endl;*/}
阅读全文
0 0
- 模拟实现vector容器
- 以模板模拟实现Vector容器
- 模拟实现STL中的Vector容器
- 模拟实现容器vector(含迭代器、类型萃取)
- 容器Vector模拟
- 【STL】C++模拟Vector容器
- STL vector 容器实现
- vector容器的实现
- 实现vector容器
- 【C++】实现容器Vector
- 【STL】 vector 模拟实现
- <STL>模拟实现Vector
- c++:模拟实现vector
- 模拟实现Vector
- 【STL】模拟实现vector
- 模拟实现vector
- 模拟实现vector
- 模拟实现STL-Vector
- HDU-1207-汉诺塔II
- NYOJ 8. 一种排序
- 28.Android-多媒体(视频播放器-拍照-录像)
- 网络设备的一些配置
- NYOJ 69 数的长度
- 模拟实现vector容器
- HDU 1709-The Balance(母函数的应用)
- 1045. Favorite Color Stripe (30)
- 网络通信-端口汇总
- 重识Zookeeper(一):zookepper简介
- POJ1986-Distance Queries(LCA)
- Unity3D学习记录——飞盘射击游戏3
- iOS 下拉 图片放大 swift
- Generate Signed APK时报"MissingTranslation"类型错误