STL模拟实现vector
来源:互联网 发布:淘宝预定手办确认收货 编辑:程序博客网 时间:2024/04/29 03:01
首先给出所需要实现的函数接口和类的封装
template<class T>class Vector{public:Vector();//无参构造函数Vector(const T* array, size_t size);//有参数构造函数Vector(const Vector & v);//拷贝构造函数Vector& operator=(const Vector& s);//赋值运算符重载~Vector();//析构函数void PushBack(const T& data);//尾插void PopBack();//弹出尾部最后一个元素void Insert(size_t pos, const T& data);//指定位置的插入void Erase(size_t pos);//指定位置的删除size_t Size()const;//求元素个数 size_t Capacity()const;//求空间容量bool Empty()const;//判空void Resize(size_t newSize, const T& data = T());//更改元素个数T& operator[](size_t index);const T& operator[](size_t index)const;friend ostream& operator<<(ostream &out, Vector<T>& s);T& Front();//返回第一个元素const T& Front()const;T& Back(); const T& Back()const;//返回最后一个元素void Clear();private: void _CheckCapacity();//判满函数private:T* _start;//指向起始位置T* _finish;//指向最后一个元素末尾T* _endOStorage;//指向开辟空间末尾0};接下来给出上面接口的具体的实现,但是其中有类型萃取,因为需要根据不同的数据类型进行不同的赋值方式,从而提高程序的效率。
下面给出所有的实现代码和我自己的测试代码
struct TrueType{static bool IsPODType(){return true;}};struct FalseType{static bool IsPODType(){return false;}};template<class T>struct TypeTraits{typedef FalseType PODtype;};template<>struct TypeTraits<double>{typedef TrueType PODtype;};template<>struct TypeTraits<int>{typedef TrueType PODtype;};template<>struct TypeTraits<char>{typedef TrueType PODtype;};//上面是类型萃取部分的代码template<class T>class Vector{public:Vector();//无参构造函数Vector(const T* array, size_t size);//有参数构造函数Vector(const Vector & v);//拷贝构造函数Vector& operator=(const Vector& s);//赋值运算符重载~Vector();//析构函数void PushBack(const T& data);//尾插void PopBack();//弹出尾部最后一个元素void Insert(size_t pos, const T& data);//指定位置的插入void Erase(size_t pos);//指定位置的删除size_t Size()const;//求元素个数 size_t Capacity()const;//求空间容量bool Empty()const;//判空void Resize(size_t newSize, const T& data = T());//更改元素个数T& operator[](size_t index);const T& operator[](size_t index)const;friend ostream& operator<<(ostream &out, Vector<T>& s);T& Front();//返回第一个元素const T& Front()const;T& Back(); const T& Back()const;//返回最后一个元素void Clear();private: void _CheckCapacity();//判满函数private:T* _start;//指向起始位置T* _finish;//指向最后一个元素末尾T* _endOStorage;//指向开辟空间末尾0};template<class T>Vector<T>::Vector():_start(0), _finish(0), _endOStorage(0){}template<class T>Vector<T>::~Vector(){if (_start){delete[] _start;_start = _finish = _endOStorage = NULL;}}template<class T>Vector<T>::Vector(const T* array, size_t size):_start(new T[size]), _finish(_start+size), _endOStorage(_finish){if (TypeTraits<T>::PODtype::IsPODType()){memcpy(_start, array, sizeof(T)*size);}else{for (size_t i = 0; i < size; ++i)_start[i] = array[i];}}template<class T>Vector<T>& Vector<T>::operator=(const Vector& s){if (s._start != _start){_start = new T[s.Capacity()]//新开辟容量if (TypeTraits<T>::PODtype::IsPODType()){memcpy(_start, array, sizeof(T)*size);}else{for (size_t i = 0; i < size; ++i)*_start[i] = *s._start[i];}delete s._start;}return;}template<class T>void Vector<T>::_CheckCapacity(){if (_finish == _endOStorage){size_t n = Size();T *start = new T[Capacity() + 5];//多开辟if (TypeTraits<T>::PODtype::IsPODType()){memcpy(start,_start, sizeof(T)*n);}else{for (size_t i = 0; i < n; ++i)start[i] = _start[i];}_finish = start + Size();_endOStorage = start+Capacity()+5;delete [] _start;_start = start;}return;}template<class T>void Vector<T>::Insert(size_t pos, const T& data)//指定位置插入元素{assert(pos <= Size()+1);_CheckCapacity();//判满size_t n = Size();for (size_t i =n; i >=pos; i--){_start[i] = _start[i - 1];}_start[pos-1] = data;_finish++;}template<class T>void Vector<T>::Erase(size_t pos)//指定位置的删除{if (!Empty()){size_t n = Size();//获得元素个数for (size_t i = pos-1; i<n-1; i++)//删除位置后面的元素向后移动{_start[i] = _start[i+1];}_finish--;}}template<class T>void Vector<T>::PushBack(const T& data){_CheckCapacity();*_finish++ = data;}template<class T>void Vector<T>::PopBack(){if (!Empty()){_finish--;}return;}template<class T>void Vector<T>::Resize(size_t newSize, const T& data = T())//改变元素个数,新增加的空间所赋值的元素{if (newSize<=Size()){_finish = _start + newSize;}else if (newSize > Size() && newSize < Capacity()){for (size_t i = Size(); i < newSize; i++){_start[i] = data;//多出来的元素赋值为data_finish = _start + newSize;}}else{T *start = new T[newSize];for (size_t i=0; i < Size(); i++){start[i] = _start[i];}for (size_t j = Size(); j < newSize; j++){start[j] = data;}delete[] _start;_start = start;_finish = _start + newSize;_endOStorage = _start + newSize;}}template<class T>bool Vector<T>::Empty()const{if (_start == _finish)return true;else return false;}template<class T>size_t Vector<T>::Size() const//元素个数{return _finish - _start;}template<class T>size_t Vector<T>::Capacity()const{return _endOStorage - _start;}template<class T>T& Vector<T>::operator[](size_t index){return _start[index];}template<class T>ostream& operator<<(ostream &out, Vector<T>& s){out << s._start[i];}template<class T>T& Vector<T>::Front(){return *_start;}template<class T>const T& Vector<T>::Front()const{return *_start;}template<class T>T& Vector<T>::Back(){return *(_finish-1);}template<class T>const T& Vector<T>::Back()const{return *(_finish-1);}template<class T>void Vector<T>::Clear()//清空元素{_finish = _start;}void TestVector(){int arr[] = { 1, 2, 3, 4, 5 };Vector<int> s(arr, sizeof(arr) / sizeof(*arr));cout <<"Back()="<< s.Back() << endl;cout << "Front()="<<s.Front() << endl;size_t n1 = s.Size();for (size_t i = 0; i < n1; i++){cout << s[i] << " ";}cout << endl;s.Insert(6, 6);s.Insert(1, 0); size_t n = s.Size();for (size_t i = 0; i < n; i++){cout << s[i] << " ";}cout << endl;s.Erase(1);size_t n2 = s.Size();for (size_t i = 0; i < n2; i++){cout << s[i] << " ";}cout << endl;s.Resize(10, 10);size_t n3 = s.Size();for (size_t i = 0; i < n3; i++){cout << s[i] << " ";}cout << endl;s.Resize(5, 10);size_t n4 = s.Size();for (size_t i = 0; i < n4; i++){cout << s[i] << " ";}cout << endl;cout << "Capacity=" << s.Capacity() << endl;string s1[] = { "aaa", "bbb","ccc","dddd"};string s3[4];Vector<string> s2(s1, sizeof(s1) / sizeof(*s1));size_t n5 = s2.Size();for (size_t i = 0; i < n5; i++){cout << s2[i] << " ";}cout << endl;}测试结果如下,自己可以根据自己的想法去测试上面的功能
阅读全文
0 0
- 【STL】 vector 模拟实现
- <STL>模拟实现Vector
- 【STL】模拟实现vector
- 模拟实现STL-Vector
- STL模拟实现vector
- 【STL】vector的模拟实现
- 模拟实现STL中的vector
- stl vector 模拟实现修改版
- STL-模拟实现vector(含类型萃取)
- 【STL】之Vector的模拟实现
- 类模板模拟实现STL中Vector
- 模拟实现STL中的Vector容器
- 使用Vector模拟实现STL中的stack
- STL库中的vector的使用和模拟实现
- STL中vector的使用以及模拟实现
- zoj 3700 模拟+STL vector
- 【STL】C++模拟Vector容器
- STL vector 容器实现
- fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory
- MySQL 5.6解压缩版安装配置方法图文教程(win10)
- 使用NetBeans IDE自动生成代码调用netweaver PI 接口
- Egg + Vue 服务端渲染工程化建设
- 机器学习实战【8】(AdaBoost)
- STL模拟实现vector
- Linux的时间设置与同步(NTP)
- Internet Download Accelerator Pro(高速下载工具)官方正式版V6.14.2.1579下载 | Download Master
- MVC中Spring配置以及程序启动出现错误记录
- Linux-软件安装 yum源 资源共享服务的使用
- JSP和HTML的区别
- Springboot 之 自定义配置文件及读取配置文件
- 四.ARM裸机学习之Makefile和mkv210_image.c文件详解
- wpf异步绑定