模板实现Vector
来源:互联网 发布:淘宝哪个母婴店比较好 编辑:程序博客网 时间:2024/05/01 05:11
模板
模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。
模板实现Vector优点
通过使用模板实现Vector可以提高代码的复用度,原先在实现Vector只能定义一种具体类型,如果要再定义另外一种类型,必须将代码重新修改一遍,通过模板实现Vector解决了代码复用度低的问题。
头文件部分:
#include <iostream>using namespace std;#include<assert.h>#include<string>
Vector定义:
注意:
1.模板实现Vector类时,类的类型是Vector< T >
2.在传参数时,注意考虑当T的类型为string是,该如何设置参数
template<class T>class Vector{public: Vector() :_data(NULL) , _size(0) , _capacity(0) {} Vector(const Vector<T>& v) { _data = new T[v._capacity]; if (v._size != 0) { for (size_t i = 0; i < v._size; ++i) { _data[i] = v._data[i]; } _size = v._size; _capacity = v._capacity; } } Vector<T>& operator=(const Vector<T>& v) { if (this != &v) { Vector<T> tmp(v); swap(_data, tmp._data); _size = tmp._size; _capacity = tmp._capacity; } return *this; } ~Vector() { if (_data != NULL) { delete[] _data; _size = _capacity = 0; _data = NULL; } }public: void PushBack(const T& data) { CheckCapacity(); _data[_size++] = data; } void PopBack() { if (_size != 0) { if (--_size == 0) delete[] _data; } } void Erease(size_t pos) { assert(pos >= 0 && pos<_size && _size>0); size_t i = pos; while (i < _size-1) { _data[i] = _data[i+1]; i++; } _size--; } T& Front() { return *_data; } void Insert(size_t pos, const T& data) { assert(pos >= 0 && pos <= _size); CheckCapacity(); size_t i = _size; while(i > pos) { _data[i] = _data[i-1]; --i; } _data[pos] = data; ++_size; } bool Empty() { if (_size == 0) return true; else return false; } void Display() { for (size_t i = 0; i < _size; ++i) { cout << _data[i] << " "; } cout << endl; }protected: void CheckCapacity() { if (_size >= _capacity) { size_t NewCapacity = 2 * _capacity + 3; T* tmp = new T[NewCapacity]; if (_data != NULL) { //memcpy(tmp, _data, sizeof(int)*_size);错误分析见下 for (size_t i = 0; i < _size; ++i) { tmp[i] = _data[i]; } delete[] _data; } _data = tmp; _capacity = NewCapacity; } }protected: T* _data; size_t _size; size_t _capacity;};
关于在CheckCapacity()中由于//memcpy(tmp, _data, sizeof(int)*_size);语句在测试函数Test2()出现崩溃原因分析:
在此处涉及浅拷贝的现象,memcpy()为值拷贝,即发生浅拷贝。
当字符串长度不超过Buf[15]数组存储长度,字符串是存储在Buf[15]数组中的,memcpy可以实现拷贝;当字符串的长度超过Buf[15]数组可以存储的范围后,Buf[15]就弃之不用,通过_ptr来存储指向字符串的指针,此时就得注意浅拷贝的问题,故使用for循环来拷贝字符串的内容。
测试部分:
void Test1(){ Vector<int> v1; v1.PushBack(1); v1.PushBack(2); v1.PushBack(3); v1.PushBack(4); v1.Display(); v1.PopBack(); v1.PopBack(); v1.PopBack(); v1.PopBack(); v1.PopBack(); v1.Display();}void Test2(){ Vector<string> v1; v1.PushBack("123111111111111111111111111"); v1.PushBack("456"); v1.PushBack("789"); v1.PushBack("111"); v1.Display();}void Test3(){ Vector<string> v1; v1.PushBack("123"); v1.PushBack("456"); v1.PushBack("789"); v1.PushBack("111"); v1.Display(); Vector<string> v2(v1); v2.Display(); getchar();}void Test4(){ Vector<string> v1; v1.PushBack("123"); v1.PushBack("456"); v1.PushBack("789"); v1.PushBack("111"); v1.Display(); v1.Erease(1); v1.Display(); v1.Erease(1); v1.Display(); v1.Erease(1); v1.Display(); v1.Erease(1); v1.Display(); getchar();}void Test5(){ Vector<int> v1; v1.PushBack(1); v1.PushBack(2); v1.PushBack(3); v1.PushBack(4); v1.Display(); Vector<int> v2(v1); v2.Display(); Vector<int> v3; v3.Insert(0, 5); v3.Display(); v3 = v2; v3.Display(); v3.Insert(1, 6); v3.Display(); cout<<v3.Front()<<endl; getchar();}
0 0
- 模板实现Vector
- 【c++】模板实现动态Vector
- C++模板类实现Vector
- C++向量Vector模板的实现
- C模板实现STL容器中的vector
- 【c++】模板实现vector和list
- 以模板模拟实现Vector容器
- 类模板模拟实现STL中Vector
- vector模板类的C++实现
- 用模板实现顺序表Vector
- 【C++】用模板实现顺序表Vector
- 有关模板类----实现Vector的类模板
- 模板:vector
- 使用堆实现PriorityQueue类模板(vector)
- vector相关的模板类函数声明与实现
- C++ 模板实现Vector和双向链表
- 用vector实现矩阵, vector传参必须用模板泛型
- STL之vector模板
- BottomNavigationView 的使用
- Java中的 Map.Entry接口与map的遍历方式
- 多线程访问共享对象和数据方法
- View事件分发上
- 无线术语解读
- 模板实现Vector
- 237. Delete Node in a Linked List
- android官方侧滑菜单DrawerLayout详解
- Codeforces Round #202 (Div. 1) D. Turtles dp
- the (?) Way
- <a>标签中href="javascript:;"表示什么意思??
- 深入分析Java ClassLoader原理
- python对象解释说明以及操作实例
- Makefile使用总结