C++使用模板实现顺序表
2017-12-02 18:34
435 查看
#pragma once #include<iostream> using namespace std; #include<stdlib.h> #include<assert.h> typedef int DataType; class SeqList { public: SeqList() : _pData(new DataType[3]) , _capacity(3) , _size(0) {} SeqList(DataType* array, size_t size) : _pData(new DataType[size]) , _capacity(size) , _size(size) { for (size_t i = 0; i < size; ++i) _pData[i] = array[i]; } SeqList(const SeqList& s) { _pData = new DataType[s._size]; _capacity = s._size; _size = s._size; for (size_t i = 0; i < s._size; ++i) { _pData[i] = s._pData[i]; } } SeqList& operator=(const SeqList& s) { if (this->_pData) { _pData = new DataType[]; memcpy(_pData, s._pData, sizeof(DataType)*s._size); } } ~SeqList() { if (_pData) { delete[] _pData; _pData = NULL; _capacity = 0; _size = 0; } } void PushBack(const DataType& data)//尾插 { CheckCapacity(); _pData[_size] = data; ++_size; } void PopBack() //尾删 { if (_size) { --_size; } } DataType Find(DataType data) //查找 { for (DataType j = 0; j <= (DataType)_size; j++) { if (data == _pData[j]) { return 1; } } return -1; } // 参数检测 void Insert(size_t pos, DataType data) //插入 { if (pos > _size) return; CheckCapacity(); size_t end = _size; while (end >= pos) { _pData[end + 1] = _pData[end]; --end; } _pData[pos] = data; ++_size; } void Erase(size_t pos) //固定位置删除 { assert(pos <= _size); size_t end = _size; while (pos < end) { _pData[pos] = _pData[pos + 1]; pos++; } --_size; } size_t Size()const //返回顺序表的大小 { return _size; } size_t Capacity()const //返回顺序表的当前容量 { return _capacity; } bool Empty()const //判断顺序表是否为空 { return 0 == _size; } // 将顺序表中的元素改成newSize DataType& operator[](size_t index) { assert(index < _size); return _pData[index]; } const DataType& operator[](size_t index)const { return _pData[index]; } DataType& Front() // 获取顺序表中第一个元素 { return _pData[0]; } const DataType& Front()const // 获取顺序表中第一个元素 { if (_size) { return _pData[0]; } else return NULL; } DataType& Back() // 获取顺序表中最后一个元素 { return _pData[_size-1]; } const DataType& Back()const // 获取顺序表中最后一个元素 { return _pData[_size-1]; } void Clear() //清空顺序表 { _size = 0; } void CheckCapacity() //检测顺序表的容量 { if (_size >= _capacity) { size_t NewCapacity = _capacity * 2 + 3; DataType* pTemp = new DataType[NewCapacity]; for (size_t i = 0; i < _size; ++i) { pTemp[i] = _pData[i]; } delete _pData; _pData = pTemp; _capacity = NewCapacity; } } void ReSize(size_t newSize, DataType data = DataType()) { if (newSize < _size) _size = newSize; else if (newSize>=_size&&newSize<_capacity) { for (size_t i = _size; i < newSize; ++i) _pData[i] = data; _size = newSize; } else { DataType* pTemp = new DataType[newSize]; for (size_t i = 0; i < _size; ++i) pTemp[i] = _pData[i]; for (size_t i = _size; i < newSize; ++i) pTemp[i] = data; delete _pData; _pData = pTemp; _capacity = newSize; _size = newSize; } } friend ostream& operator<<(ostream& _cout, const SeqList& s) { for (size_t i = 0; i < s._size; ++i) cout << s._pData[i] << " "; return _cout; } private: DataType* _pData; size_t _capacity; // 最大元素的个数 size_t _size; // 有效元素的个数 }; void TestSeqList() { int array[] = { 1, 2, 3, 4 }; SeqList s1(array, sizeof(array) / sizeof(array[0])); s1.PushBack(5); cout << s1 << endl; cout << s1.Size() << endl; cout << s1.Capacity() << endl; s1.ReSize(2); cout << s1 << endl; cout << s1.Size() << endl; cout << s1.Capacity() << endl; s1.ReSize(6); cout << s1 << endl; cout << s1.Size() << endl; cout << s1.Capacity() << endl; s1.ReSize(20); cout << s1 << endl; cout << s1.Size() << endl; cout << s1.Capacity() << endl; } int main() { TestSeqList(); return 0; }
运行结果:
相关文章推荐
- 使用C++模板实现栈的求最小值功能
- 使用C++模板实现不需要IDL的RPC【二】
- 2叉树遍历的递归实现-使用c++模板
- C++ 使用模板实现单例模式
- C/C++使用模板实现数据栈
- C++_模板举例_使用模板实现集合类(堆栈)
- C++_模板举例_使用模板实现集合类(堆栈)
- C++使用模板实现数值型字符串类型间的转换
- C++ 使用模板实现一个List的实例
- C++使用模板并隐藏实现
- C++模板及用模板实现双向循环链表,顺序表
- 使用C++模板技术实现类的动态注册和获取
- 使用C++实现AVL树模板
- C++ 使用模板实现的一个List
- C++ 使用模板实现冒泡排序
- [C++模板]Clang3.9使用变参模拟实现CheckerFn和Checker
- C++ 使用模板 实现单例模式
- C++用模板实现顺序表和栈
- 数据结构(1)顺序表 c++ 模板实现
- 使用C++的类模板实现Stack类