c++(模板类)实现顺序表
2017-04-09 16:14
441 查看
#pragma once #include <iostream> #include <string> #include <assert.h> using namespace std; template<typename T> class SeqList { public: SeqList() :_a(NULL) ,_capacity(0) ,_size(0) {} SeqList(const SeqList<T>& s) :_size(s._size) ,_capacity(s._capacity) ,_a(new T[s._capacity]) { for (size_t i=0;i<_capacity;i++) { _a[i]=s._a[i]; } } SeqList<T>& operator= (SeqList<T> s) { if(this!=&s) { delete _a; _a=new T[s._capacity]; for (size_t i=0;i<s._size;i++) { _a[i]=s._a[i]; } _capacity=s._capacity; _size=s._size;} return *this; } ~SeqList() { if (_a) { delete[] _a; //free(_a); _size = _capacity = 0; _a=NULL; } } void PushBack(const T& x) { _CheckCapacity(); _a[_size] = x; //? ++_size; } void PopBack() { if(_size > 0) --_size; } T& Back() { assert(_size > 0); return _a[_size-1]; } size_t Size() { return _size; } bool Empty() { return _size == 0; } void PushFront(const T& x) { _CheckCapacity(); size_t end= _size; while (end-->=1) { _a[end+1]=_a[end]; } _a[0]=x; ++_size; } void popFront() { if (_size==0) { return; } else if(_size > 0) { --_size; _a[_size]=_a[_size+1]; } } void Print() { for (size_t i = 0; i < _size; ++i) { cout<<_a[i]<<" "; } cout<<endl; } protected: void _CheckCapacity() { if (_size >= _capacity) { _capacity = _capacity*2+3; T* tmp = new T[_capacity]; if (_a) { // 优化 //memcpy(tmp, _a, sizeof(T)*_size); //若模板类是内置类型或string字符串小于16时使用memcpy完全可以, //但是当字符串大于15时,这种方式就会出现问题,因为此时的数据 //就不是存放于buf中了,而是用ptr指针指向一个空间保存数据, //因为memcpy是值拷贝,所以现在会将ptr的地址拷到新的ptr空间, //此时是两个指针指向同一块空间,拷贝完成后将就得空间释放时, //新的ptr就变成了野指针,所以程序崩溃。 for (size_t i = 0; i < _size; ++i) { tmp[i] = _a[i]; } delete[] _a; } _a = tmp; } } protected: T* _a; size_t _size; size_t _capacity; }; // Push / Pop void TestSeqList1() { SeqList<int> s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.Print(); s1.PopBack(); s1.PopBack(); s1.PopBack(); s1.PopBack(); s1.PopBack(); s1.Print(); } // 拷贝、复制运算符的重载 void TestSeqList2() { SeqList<int> s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.Print(); SeqList<int> s2(s1); s2.Print(); SeqList<int> s3; s3 = s2; s3.Print(); } void TestSeqList3() { // 深层次的深浅拷贝 SeqList<string> s1; s1.PushBack("11111"); s1.PushBack("222222222"); s1.PushBack("33"); s1.PushBack("4444444444444444444444444444444444444444444444 "); s1.PushBack("33"); s1.PushBack("33"); s1.PushBack("33"); s1.PushBack("33"); s1.PushBack("33"); s1.PushBack("33"); s1.Print(); } void TestSeqList4() { SeqList< int> s4; s4.PushFront(1); s4.PushFront(1); s4.popFront(); s4.popFront(); s4.popFront(); s4.Print(); }
#include "SeqList.h"
int main()
{
TestSeqList1();
TestSeqList2();
TestSeqList3();
TestSeqList4();
return 0;
}
相关文章推荐
- C++模板类实现顺序表
- C++模板类实现顺序表
- 【C++】用模板类实现顺序表
- 二叉堆的c++模板类实现
- 数据结构(1)顺序表 c++ 模板实现
- 在VC9.0中实现C++模板类头文件和实现文件分离的方法
- 算法与数据结构课程中的c++实现的顺序表和链表
- 【C++】栈——顺序表实现V1.0(源码提供)
- 单链表的C++实现(采用模板类)
- C++模板类实现“堆”的经典案例学习+(优先队列)
- 在VC9.0中实现C++模板类头文件和实现文件分离的方法
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
- 可变长度 顺序表 C++实现
- 顺序表 C++模板实现
- C++模板类头文件和实现文件分离的方法(vs2012测试)
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- 【C++】队列——顺序表实现V1.0(源码提供)
- C++实现模板顺序表和三种排序方法
- 模板类的友元重载,用C++代码实现
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)