首页
IT
登录
6mi
u
盘
搜
搜 索
IT
模板类实现顺序表
模板类实现顺序表
xiaoxiao
2021-03-25
78
#include <iostream>
using
namespace
std
;
template
<
class
T>
class
Vector {
//定义几个类型,以便于管理
public
:
typedef
T ValueType;
typedef
ValueType* Pointer;
typedef
const
ValueType* ConstPointer;
typedef
ValueType* Iterator;
typedef
const
ValueType* ConstIterator;
typedef
ValueType& Reference;
typedef
const
ValueType& ConstReference;
typedef
size_t SizeType;
public
:
// 构造函数-无参数
Vector() : _start(
0
) , _end(
0
) , _endOfStorage(
0
) { }
// 构造函数-有参数-->n个值为value的数据
Vector(SizeType n,
const
T& value) { FillAndInit(n, value); }
//构造函数-有参数-->n个默认的元素
Vector(SizeType n) { FillAndInit(n, T()); }
//拷贝构造函数
Vector(
const
Vector<T>& v) { _start =
new
T[v.Capacity()]; _end = _start + v.Size(); _endOfStorage = _start + v.Capacity();
for
(size_t idx =
0
; idx < v.Size(); idx++) _start[idx] = v._start[idx]; }
// 赋值运算符的重载函数
Vector<T>&
operator
=(
const
Vector<T>& v) { _start =
new
T[v.Capacity()]; _end = _start + v.Size(); _endOfStorage = _start + v.Capacity();
for
(size_t idx =
0
; idx < v.Size(); idx++) { _start[idx] = v._start[idx]; }
return
*
this
; }
//析构函数
~Vector() {
delete
[] _start;
//只为_start开辟空间了,所以只释放_start的空间
_start = NULL; }
/*---操作容量的一系列函数---*/
//返回容量的大小
SizeType Capacity()
const
{
return
SizeType(_endOfStorage - Begin());
// 记得强转为SizeType型的数据再返回
}
//返回此时存了多少个数据
SizeType Size()
const
{
return
SizeType(_end - _start); }
//返回这个开辟的空间最多能存多少个数据
SizeType MaxSize()
const
{
return
SizeType(-
1
) /
sizeof
(T);
//数据容量用SizeTyep类型的标量保存,用最大的数字除以每个数据的大小,既是可保存数据的作答容量
}
//判断该对象是否为空,空则返回1,否则返回0
bool
Empty()
const
{
return
(Begin() == End()); }
/*---一系列操纵表中数据的函数---*/
// []的重载函数,可以直接用下标访问表中元素
Reference
operator
[](size_t index) {
return
_start[index]; }
// const类型的[]的重载函数,可以直接用下标访问表中元素
ConstReference
operator
[](size_t index)
const
{
return
*(begin() + index); }
// 采用引用返回头元素的值
Reference Front() {
return
*Begin(); }
//采用const的引用返回头元素的值
ConstReference Front()
const
{
return
*Begin(); }
// 采用引用返回尾元素的值
Reference Back() {
return
*(End() -
1
); }
//采用const的引用返回尾元素的值
ConstReference Back()
const
{
return
*(End() -
1
); }
/*---对于简单迭代器的操作---*/
// 返回头指针的函数,可使操作中不直接对头指针操作
Iterator Begin() {
return
_start; } ConstIterator Begin()
const
{
return
_start; }
// 返回尾指针的函数,可使操作中不直接对尾指针操作
Iterator End() {
return
_end; } ConstIterator End()
const
{
return
_end; }
/*---一些栈上的操作---*/
public
:
// 入栈即尾插入一个值为value的元素
void
PushBack(
const
T& value) { CheckCapacity(); SizeType num = Size(); _start[num] = value; _end++;
cout
<<
"PushBack Down"
<< endl; }
//尾删一个元素
void
PopBack() {
if
(Empty()) {
cout
<<
"Nothing To Pop"
<< endl;
return
; } --_end;
cout
<<
"Pop Dowm"
<< endl; }
// 在position位置插入元素data
Iterator Insert(Iterator position,
const
T& data) { CheckCapacity();
for
(Iterator index = _end -
1
; index >= position; index--) { *(index +
1
) = *index; } *position = data; ++_end;;
return
position; }
// 删除position位置的元素
Iterator Erase(Iterator position) {
for
(Iterator index = position; index < End(); index++) { *index = *(index +
1
); } _end--;
return
position; }
//为插入操作找出一个位置
Iterator Find(
const
T& value) { size_t i =
0
;
while
(_start != _end) {
if
(value == _start[i]) {
return
_start + i; } i++; }
cout
<<
"This Value Doesn't Exist!"
<< endl <<
"We Return A NULL Position!"
<< endl;
return
NULL; }
protected
:
// 填充函数,并初始化这个表
void
FillAndInit(SizeType n,
const
T& value) { _start =
new
T[n]; _end = _start + n; _endOfStorage = _start + n;
for
(size_t idx =
0
; idx < n; idx++) { _start[idx] = value; } }
//判断表满与否。满则多开辟一段空间
void
CheckCapacity() {
if
(Size() == Capacity()) { SizeType num =
2
* Capacity() +
100
; Iterator ptemp =
new
T[num]; size_t idx =
0
;
for
(idx =
0
; idx < Size(); idx++) { ptemp[idx] = _start[idx]; }
delete
_start; _start = ptemp; _end = _start + idx; _endOfStorage = _start + num; }
else
return
; }
// 重载输出运算符,使之能直接输出所有元素
friend
ostream&
operator
<<(ostream& os, Vector<T>& v) {
for
(T* p = v.Begin(); p < v.End(); p++) { os << *p <<
" "
; }
return
os; }
protected
: Iterator _start; Iterator _end; Iterator _endOfStorage; };
//测试函数,测试以上类中的所有函数
void
FunTest() { Vector<
int
> v1(
5
,
1
);
cout
<<
"v1 = "
<< v1 << endl;
cout
<<
"v1.size = "
<< v1.Size() << endl;
cout
<<
"v1.capacity = "
<< v1.Capacity() << endl;
cout
<<
"v1 pushback 5"
<< endl; v1.PushBack(
5
);
cout
<<
"v1 = "
<< v1 << endl;
cout
<<
"v1.capacity = "
<< v1.Capacity() << endl;
cout
<<
"v1.size = "
<< v1.Size() << endl; v1[
1
] =
10
; v1[
2
] =
20
; v1[
3
] =
30
; v1[
4
] =
40
; v1[
5
] =
50
; v1[
6
] =
60
;
cout
<<
"v1 change its members"
<< endl;
cout
<<
"v1 = "
<< v1 << endl;
int
* pos1 = v1.Find(
10
);
cout
<<
"v1 insert 100 at where 10 is"
<< endl; v1.Insert(pos1,
100
);
cout
<<
"v1 = "
<< v1 << endl;
int
* pos2 = v1.Find(
50
);
cout
<<
"v1 delete 50"
<< endl; v1.Erase(pos2);
cout
<<
"v1 = "
<< v1 << endl;
cout
<<
"v1.Front = "
<< v1.Front() << endl;
cout
<<
"v1.Back = "
<< v1.Back() << endl;
cout
<<
"v1 popback until empty"
<< endl; size_t tmp = v1.Size();
for
(size_t i =
0
; i <= tmp; i++) { v1.PopBack(); }
cout
<<
"v1 = "
<< v1 << endl; Vector<
char
> v2(
10
,
'a'
);
cout
<<
"v2 = "
<< v2 << endl; Vector<
double
> v3(
7
,
1.23
);
cout
<<
"v3 = "
<< v3 << endl; Vector<
char
*> v4(
3
,
"duanliming"
);
cout
<<
"v4 = "
<< v4 << endl; Vector<
double
> v5(v3);
cout
<<
"v5 copy v3 "
<< endl;
cout
<<
"v5 = "
<< v5 << endl; Vector<
char
> v6;
cout
<<
"v6 use "
<<
"="
<<
" by v2"
<< endl; v6 = v2;
cout
<<
"v6 = "
<< v6 << endl;
cout
<<
"v6.capacity = "
<< v6.Capacity() << endl;
cout
<<
"v6.MaxSize = "
<< v6.MaxSize() << endl; }
int
main() {
cout
<<
" ALL THE ACTION IS TESTING"
<< endl; FunTest(); system(
"pause"
);
return
0
; }
转载请注明原文地址: https://ju.6miu.com/read-33408.html
技术
最新回复
(
0
)