模板顺序表实现

注意内置类型时,使用memcpy没问题,在拷贝构造和赋值运算符重载时;

而在自定义类型时(string),必须用类型的operator=拷贝,否则会崩溃(使用了已释放的内存_ptr,调用delete时会调其析构函数)

#include<iostream>
#include<string>
using namespace std;
template<typename T>
class SeqList
{
public:
	SeqList();
	SeqList(const SeqList<T>& s);
	SeqList<T>& operator=(const SeqList<T>& s);
	~SeqList();
	void PushBack(const T& data);
	void PopBack();
	void Print();
protected:
	void  _CheckCapacity(int capacity)
	{
		if (capacity > _capacity)
		{
			_capacity = capacity * 2 + 3;
			Destory(_data);
			_data = new T[_capacity];
		}
	
	}
	void  Destory(T*& _data)
	{
		if (_data != NULL)
		{
			delete[] _data;
			_data = NULL;
		}
	}
protected:
	T*  _data;
	int  _capacity;
	int _size;
};
template<class T> SeqList<T>::SeqList()
:_data(NULL)
, _capacity(0)
, _size(0)
{

}
template<class T> SeqList<T>::SeqList(const SeqList<T>& s)
:_data(new T[s._capacity])
, _capacity(s._capacity)
, _size(s._size)
{
	//memcpy(_data, s._data,s._size*sizeof(T));//有副作用,如果是自定义类型的话,指针指向_ptr的是浅拷贝(释放后还使用)
	for (int i = 0; i < s._size; i++)
	{
		_data[i] = s._data[i];//operator=
	}
}
//或者形参为SeqList<T> s临时变量,交换_data,出了作用域自己释放
 template<class T> SeqList<T>& SeqList<T>:: operator=(const SeqList<T>& s)
{
	 if (this != &s)
	 {
		 _Destroy(this->_data);
		 _data = new T[s._capacity];
		// memcpy(_data, s._data,s._size*sizeof(T));//内置类型使用memcpy
		 for (int i = 0; i < s._size; i++)
		 {
			 _data[i] = s._data[i];//operator=
		 }
		 _capacity = s._capacity;
		 _size = s._size;
	 }
	 return *this;
}
 template<class T> SeqList<T>:: ~SeqList()
 {
	 Destory(_data);
 }
 template<class T> void  SeqList<T>::PushBack(const T& data)
 {
	 int capacity = _size + 1;
	 _CheckCapacity(capacity);
	 _data[_size++] = data;
 }
 template<class T> void  SeqList<T>::PopBack()
 {
	 if (_size>0)
	     _size--;
 }
 template<class T> void SeqList<T>::Print()
 {
	 for (int i = 0; i<_size; ++i)
	 {
		 cout << _data[i] << " ";
	 }
	 cout << endl;
 }

void Test1()
{
	SeqList<int> s;
	s.PushBack(1);
	s.PushBack(2);
	s.PushBack(3);
	s.PushBack(4);
	s.PushBack(5);
	s.Print();
	SeqList<int> s1;
	s1 = s;
	s1.Print();
}
void Test2()
{
	SeqList<string> l;
	l.PushBack("abc");
	l.PushBack("dlllllllllllllllllllllllllllllef");
	l.PushBack("jkl");
	l.PushBack("lwdw");
	l.Print();
	SeqList<string> s(l);
	s = l;
	s.Print();
}
int main()
{
	Test2();
	system("pause");
	return 0;
}


你可能感兴趣的:(顺序表)