C++模板类实现Vector
来源:互联网 发布:硅胶点胶机编程视频 编辑:程序博客网 时间:2024/05/21 23:33
定义类模板(class template)
在定义的类模板中,使用模板形参作为类型或值的占位符,在使用类时再提供具体的类型或值。
代码实现:
1、
Vector<int>Vector<char>
#include<iostream>#include<assert.h>using namespace std;template<typename T>class Vector{public: Vector()//构造 :_start(0) , _finish(0) , _endOfStorage(0) {} Vector(const T* array, size_t size);//带参构造函数声明 Vector(const Vector<T>& v)//拷贝构造 { size_t size = v.Size(); T* temp = new T[size]; assert(temp); for (size_t i = 0; i < size; i++) { temp[i] = v[i]; } delete[] _start; _start = temp; _finish = _start + size; _endOfStorage = _finish; } Vector& operator=(const Vector<T>& s)//赋值运算符重载 { if (this != &s) { _start = new T[1]; Vector temp(s); swap(_start, temp._start); } return *this; } ~Vector() { if (_start) { delete[] _start; _start = _finish = _endOfStorage = 0; } } void Display() { size_t size = Size(); for (size_t i = 0; i < size; i++) { cout << _start[i]; } cout << endl; } ///////////////////Modify//////////////////// void PushBack(const T& data)//尾插 { CheckCapacity();//增容函数 *_finish++ = data; } void PopBack()//尾删 { --_finish; } void Insert(size_t pos, const T& data)//任意位置的插入 { size_t size = Size(); assert(pos <= size && pos >= 0); CheckCapacity(); for (size_t i = size; i > pos; i--) { _start[i] = _start[i - 1]; } _start[pos] = data; _finish++; } void Erase(size_t pos)//任意位置的删除 { size_t size = Size(); assert(pos < size && pos >= 0); for (size_t i = pos; i < size - 1; i++) { _start[i] = _start[i + 1]; } _finish--; /*if (pos = size - 1) _finish--;*/ } //////////////////capacity///////////////////// size_t Size()const//顺序表元素个数 { return _finish - _start; } size_t Capacity()const//顺序表容量 { return _endOfStorage - _start; } bool Empty()const//判空 { return _start == _finish; } void Resize(size_t newSize, const T& data = T())//元素个数改变到newSize { size_t oldsize = Size(); size_t capacity = Capacity(); if (newSize <= oldsize) { _finish = _start + newSize; } else if (oldsize < newSize&&newSize <= capacity) { //*(_finish++) = data; for (size_t i = oldsize; i < newSize; i++) { _start[i] = data; } _finish = _start + newSize; } else { T* temp = new T[newSize]; for (size_t i = 0; i < oldsize; i++) temp[i] = _start[i]; for (size_t i = oldsize; i < newSize; i++) temp[i] = data; delete[] _start; _start = temp; _finish = _start + newSize; _endOfStorage = _start + newSize; } } //////////////////Acess 元素访问///////////////// T& operator[](size_t index)//下标运算符重载 { assert(index < Size()); return _start[index]; } const T& operator[](size_t index)const { assert(index < Size()); return _start[index]; } T& Front()//返回值可以作为左值,返回引用 { return _start[0]; } const T& Front()const { return _start[0]; } T& Back()//返回最后一个元素 { //return _start[Size() - 1]; return *(_finish - 1); } const T& Back()const { //return _start[Size() - 1]; return *(_finish - 1); } void Clear()//清空顺序表 { _finish = _start; } template <class T> friend ostream& operator<<(ostream& _cout, const Vector<T>& v) { for (size_t i = 0; i < v.Size(); i++) cout << v[i] << " "; }private: void CheckCapacity() { int sz = Capacity(); int size = Size(); if (size >= sz) { int capacity = sz ? (sz * 2) : 3; //cout << capacity << endl; T* temp = new T[capacity]; for (int i = 0; i < size; i++) { temp[i] = _start[i]; } assert(temp); delete[] _start; _start = temp; _finish = _start + size; _endOfStorage = _start + capacity; } }private: T* _start; T* _finish; T* _endOfStorage;};template <class T>Vector<T>::Vector(const T* array, size_t size): _start(new T[size]), _finish(_start), _endOfStorage(_start + size){ for (size_t i = 0; i < size; i++) *_finish++ = array[i];}void Test1(){ int p1[] = { 1, 2, 3, 4, 5, 6 }; Vector<int> v1(p1, 6); cout << "v1(p1,6):" << endl; v1.Display(); cout << "size= " << v1.Size() << endl; cout << "capacity= " << v1.Capacity() << endl; cout << endl; v1.PushBack(7); cout << "PushBack(7):" << endl; v1.Display(); cout << "size= " << v1.Size() << endl; cout << "capacity= " << v1.Capacity() << endl; cout << endl; v1.Insert(1, 2); cout << "Insert():" << endl; cout <<"v2[2]:"<< v1[2] << endl; v1.Display(); cout << "size= " << v1.Size() << endl; cout << "capacity= " << v1.Capacity() << endl; cout << endl; v1.Resize(10); cout << "Resize():" << endl; v1.Display(); cout << "size= " << v1.Size() << endl; cout << "capacity= " << v1.Capacity() << endl; cout << endl; v1.Clear(); cout << "Clear():" << endl; cout << "size= " << v1.Size() << endl; cout << "capacity= " << v1.Capacity() << endl;}void Test2(){ char* p2 = "day day up"; Vector<char> v2(p2,10); cout << "v2(p2,10):" << endl; v2.Display(); cout << "size= " << v2.Size() << endl; cout << "capacity= " << v2.Capacity() << endl; cout << endl; v2.PushBack(']'); cout << "PushBack(']'):" << endl; v2.Insert(0, '['); cout << "Insert():" << endl; v2.Display(); cout << "size= " << v2.Size() << endl; cout << "capacity= " << v2.Capacity() << endl; cout << "v2[2]:" << v2[2] << endl; cout << endl; v2.Resize(20,'s'); cout << "Resize():" << endl; v2.Display(); cout << "size= " << v2.Size() << endl; cout << "capacity= " << v2.Capacity() << endl; cout << endl; v2.Clear(); cout << "Clear():" << endl; cout << "size= " << v2.Size() << endl; cout << "capacity= " << v2.Capacity() << endl;}int main(){ cout << "Vector<int>:" << endl; Test1(); cout << endl<<endl; cout << "Vector<char>:" << endl; Test2(); getchar(); return 0;}
2、
Vector<String>
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<assert.h>using namespace std;//实现Vector的以下接口:template<typename T>class Vector{public: Vector() :_start(0) , _finish(0) , _endOfStorage(0) {} Vector(const T* array, size_t size); Vector(const Vector<T>& v) { size_t size = v.Size(); T* temp = new T[size]; assert(temp); for (size_t i = 0; i < size; i++) { temp[i] = v[i]; } delete[] _start; _start = temp; _finish = _start + size; _endOfStorage = _finish; //return *this; } Vector& operator=(const Vector<T>& s) { if (this != &s) { _start = new T[1]; Vector temp(s); swap(_start, temp._start); } return *this; } ~Vector() { if (_start) { delete[] _start; _start = _finish = _endOfStorage = 0; } } void Display() { size_t size = Size(); for (size_t i = 0; i < size; i++) { cout << _start[i]; } cout << endl; } ///////////////////Modify///////////////////// void PushBack(const T& data) { CheckCapacity(); *_finish++ = data; } void PopBack() { --_finish; } void Insert(size_t pos, const T& data) { size_t size = Size(); assert(pos <= size && pos >= 0); CheckCapacity(); for (size_t i = size; i > pos; i--) { _start[i] = _start[i - 1]; } _start[pos] = data; _finish++; } void Erase(size_t pos) { size_t size = Size(); assert(pos < size && pos >= 0); for (size_t i = pos; i < size - 1; i++) { _start[i] = _start[i + 1]; } _finish--; } //////////////////capacity///////////////////// size_t Size()const { return _finish - _start; } size_t Capacity()const { return _endOfStorage - _start; } bool Empty()const { return _start == _finish; } void Resize(size_t newSize, const T& data = T()) { size_t oldsize = Size(); size_t capacity = Capacity(); if (newSize <= oldsize) { _finish = _start + newSize; } else if (oldsize < newSize&&newSize <= capacity) { for (size_t i = oldsize; i < newSize; i++) { _start[i] = data; } _finish = _start + newSize; } else { T* temp = new T[newSize]; for (size_t i = 0; i < oldsize; i++) temp[i] = _start[i]; for (size_t i = oldsize; i < newSize; i++) temp[i] = data; delete[] _start; _start = temp; _finish = _start + newSize; _endOfStorage = _start + newSize; } } /////////////////Acess 元素访问////////////////// T& operator[](size_t index) { assert(index < Size()); return _start[index]; } const T& operator[](size_t index)const { assert(index < Size()); return _start[index]; } T& Front()//返回值可以作为左值,返回引用 { return _start[0]; } const T& Front()const { return _start[0]; } T& Back() { return *(_finish - 1); } const T& Back()const { return *(_finish - 1); } void Clear() { _finish = _start; }private: void CheckCapacity() { int sz = Capacity(); int size = Size(); if (size >= sz) { int capacity = sz ? (sz * 2) : 3; T* temp = new T[capacity]; for (int i = 0; i < size; i++) { temp[i] = _start[i]; } assert(temp); delete[] _start; _start = temp; _finish = _start + size; _endOfStorage = _start + capacity; } } //template <class T> friend ostream& operator<<(ostream& _cout, const Vector<T>& v) { for (size_t i = 0; i < v.Size(); i++) cout << v[i] << " "; return _cout; }private: T* _start; T* _finish; T* _endOfStorage;};template <class T>Vector<T>::Vector(const T* array, size_t size): _start(new T[size]), _finish(_start), _endOfStorage(_start + size){ for (size_t i = 0; i < size; i++) *_finish++ = array[i];}class String{public: String(const char* pStr = " ") { if (pStr == NULL) { _pStr = new char[1]; *_pStr = '\0'; } else { _pStr = new char[strlen(pStr) + 1]; strcpy(_pStr, pStr); } } String(const String& s) :_pStr(new char[strlen(s._pStr)+1]) { strcpy(_pStr, s._pStr); } String& operator=(const String& s) { if (this != &s) { char* temp = new char[strlen(s._pStr) + 1]; strcpy(temp, s._pStr); delete[] _pStr; _pStr = temp; } return *this; } friend ostream& operator<<(ostream& _cout, const String& v) { _cout << v._pStr; return _cout; }private: char* _pStr;};void TestString(){ Vector<String> v; v.PushBack("1111"); v.PushBack("2222"); v.PushBack("3333"); cout << "PushBack()" << endl; cout << "size= " << v.Size() << endl; cout << "capacity= " << v.Capacity() << endl; cout << endl; v.PushBack("4444"); v.PushBack("5555"); cout << "PushBack()" << endl; cout << "size= " << v.Size() << endl; cout << "capacity= " << v.Capacity() << endl; cout << v << endl; cout << endl; v.Insert(1, "123"); cout << "Insert():" << endl; cout << v << endl; cout << endl; cout << "v2[2]:" << v[2] << endl; cout << endl; v.Resize(50); cout << "Resize():" << endl; v.Display(); cout << "size= " << v.Size() << endl; cout << "capacity= " << v.Capacity() << endl; cout << endl; v.Clear(); cout << "Clear():" << endl; cout << "size= " << v.Size() << endl; cout << "capacity= " << v.Capacity() << endl; cout << endl;}int main(){ TestString(); getchar(); return 0;}
阅读全文
1 0
- 【c++】模板实现动态Vector
- c++vector模板类
- c++vector模板类
- C++:STL模板类vector
- C模板实现STL容器中的vector
- 【c++】模板实现vector和list
- 【C++】用模板实现顺序表Vector
- C++模板类实现Vector
- 类模板模拟实现STL中Vector
- vector模板类的C++实现
- 模板实现Vector
- 有关模板类----实现Vector的类模板
- C++:标准模板库vector
- C++——模板类vector和array
- vector模板类
- 类模板vector入门
- vector模板类
- vector模板类
- Java基础语法试卷5(2017/10/16 第一阶段考试)
- OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function usage)
- java内存空间分析
- 子弹?不存在的
- java实现K叉树及递归和非递归遍历算法
- C++模板类实现Vector
- 1059. C语言竞赛(20)
- Linux gpio 接口
- 六级_第五天
- qt中的线程套路
- org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@17b9635 is closed
- 方程求解
- bzoj 5044 岛屿生成 构造
- linux10