用类和模板实现的顺序表

本文介绍了如何使用C++的类和模板来实现顺序表,通过链接提供的详细文章,读者可以了解到具体实现原理和步骤,内容着重于C++的面向对象特性与泛型编程的结合应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用C语言实现的链接如下:https://blog.youkuaiyun.com/weixin_43219708/article/details/103764216
原理一样,只是下面用了C++中的类和模板

#include<iostream>
#include<assert.h>
using namespace std;

template<class T>
class SeqList
{
public:
 SeqList(size_t capacity = 10)
  :_array(new T[capacity]),
  _size(0),
  _capacity(capacity)//构造函数初始化
 {}
 ~SeqList()//析构函数
 {
  if (_array)
  {
   delete[] _array;
   _array = nullptr;
   _capacity = 0;
   _size = 0;
  }
 }
 void CheckCapaticy()
 {
  if (_size == _capacity)
  {
   cout << "需要扩容" << endl;
   //申请新空间
   size_t newCapacity = _capacity * 2;
   T* temp = new T[newCapacity];
   //拷贝元素
   for (size_t i = 0; i < _size; i++)
   {
    temp[i] = _array[i];
   }
   //释放旧空间
   delete[] _array;
   _array = temp;
   _capacity = newCapacity;
   cout << "扩容成功" << endl;
  }
 }
 void PushBack(const T& data);//尾插
 void PopBack();//尾删
 void PushFront(const T& data);//头插
 void PopFront();//头删
 size_t Size();//获取元素个数
 size_t Capacity();
 void PrintTest();//打印
 
 //重载下标运算符[]   下标运算符成对重载
 T& operator[](size_t index)
 {
  assert(index < _size);
  return _array[index];
 }
 //对象的内容不能修改
 const T& operator[](size_t index) const
 {
  assert(index < _size);
  return _array[index];
 }
 
private:
 T* _array;//数组放元素  T代表顺序表中存放元素的类型
 size_t _size;//有效元素个数
 size_t _capacity;//数组总容量 
};
template<class T>
void SeqList<T>::PushBack(const T& data)//尾插
{
 CheckCapaticy();
 _array[_size++] = data;
}
template<class T>
void SeqList<T>::PopBack()//尾删
{
 _size--;
}
template<class T>
void SeqList<T>::PushFront(const T& data)//头插
{
 CheckCapaticy();
 size_t i = 0;
 for (i=_size; i >0; i--)
 {
  _array[i]=_array[i - 1];
 }
 _array[0] = data;
 _size++;//插完有效元素个数也要+1
}
template<class T>
void SeqList<T>::PopFront()//头删
{
 if (_size == 0)
  return;
 size_t i = 1;
 while (i<_size)
 {
  _array[i-1] = _array[i];
  i++;
 }
 _size--;
}

template<class T>
size_t SeqList<T>::Size()
{
 return _size;
}
template<class T>
size_t SeqList<T>::Capacity()
{
 return _capacity;
}

template<class T>
void SeqList<T>::PrintTest()//打印
{
 size_t i = 0;
 for (; i < _size - 1; i++)
 {
  cout << _array[i]<<"-->";
 }
 cout << _array[_size - 1] << endl;
}


int main()
{
 SeqList<int> s1;
 s1.PushBack(1);
 s1.PushBack(2);
 s1.PushBack(3);
 s1.PushBack(4);
 s1.PushBack(5);
 s1.PushBack(6);
 s1.PushBack(7);
 s1.PushBack(8);
 s1.PushBack(9);
 s1.PushBack(9);
 s1.PrintTest();
 cout << s1[4]<<"号元素没改之前是"<<s1[5] << endl;
 s1[5] = 20;
 s1.PopBack();
 s1.PrintTest();
 s1.PushFront(1);
 s1.PushFront(2);
 s1.PushFront(3);
 s1.PushFront(4);
 s1.PushFront(5);
 s1.PrintTest();
 s1.PopFront();
 s1.PrintTest();
 cout << "有效元素个数为:" << s1.Size() << endl;
 cout << "容量为" << s1.Capacity() << endl;
 system("pause");
 return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值