看了effective c++(第三版)的几个items,想试试.于是找回以前的数据结构课本,重新写了上课时候的第二个实验.居然花了两个小时......................惨了,速度已经降到这种地步了,需要不断strive阿.
代码如下(注释简单写了点,注释最多的地方是抄别人的........):
/*
* 程序命名规则参考林锐博士高质量c++/c编程指南
*
* -------------------------------------------
* 简单的Windows应用程序命名规则
* -------------------------------------------
*
* -------------------------------------------
* 1)类名和函数名用大写字母开头的单词组合而成。
*
* 例如:
*
* class Node; // 类名
*
* void Draw(void); // 函数名
* -------------------------------------------
*
* -------------------------------------------
* 2)变量和参数用小写字母开头的单词组合而成。
*
* 例如:
*
* BOOL flag;
* int drawMode;
* -------------------------------------------
*
* -------------------------------------------
* 3)常量全用大写的字母,用下划线分割单词。
*
* 例如:
*
* const int MAX = 100;
* const int MAX_LENGTH = 100;
* -------------------------------------------
*
* -------------------------------------------
* 4)静态变量加前缀s_(表示static)
*
* 例如:
*
* static int s_initValue; // 静态变量
* -------------------------------------------
*
* -------------------------------------------
* 5)如果不得已需要全局变量,则使全局变量加前缀g_(表示global)
*
* 例如:
*
* int g_howManyPeople; // 全局变量
* -------------------------------------------
*
* -------------------------------------------
* 6)类的数据成员加前缀m_(表示member)
* 这样可以避免数据成员与成员函数的参数同名。
*
* 例如:
*
* void Object::SetValue(int width, int height)
* {
* m_width = width;
* m_height = height;
* }
* -------------------------------------------
*
* 更多命名规范参考:c++编码规范
*/
#include
using namespace std;
//顺序表默认大小
const int c_defaultSize = 128;
//简单的顺序表
template < class T >
class SeqList
{
public:
//使用explicit,避免隐私类型转换
explicit SeqList(const int maxSize=c_defaultSize);
SeqList(const SeqList& rhs);
~SeqList();
SeqList& operator=(const SeqList& rhs);
T& operator[](const int index);
inline int Length(void) const; //计算表的长度
int Find(const T& x) const; //查找x在表中的位置
bool IsIn(const T& x) const; //判断x是否在表中
//成功返回true,失败返回false
bool Insert(T x, const int index); //插入x到第index个位置,从0开始
bool Remove(const T& x); //删除x
//成功返回true,失败返回false
int Next(const T& x) const; //寻找x的后继
int Prior(const T& x) const; //寻找x的前驱
bool IsEmpty(void) const; //判断表是否为空
bool IsFull(void) const; //判断表是否满
//!!!可能用不到
void print()
{
for (int i=0; i
cout << m_data[i] <<"/t";
cout << endl;
}
private:
T *m_data; //存放数据的数组
int m_maxSize; //最大可容纳数,可自动增加
int m_size; //当前已经存放的数据个数
//没有存放元素时为0
};
//构造函数
template< class T >
SeqList::SeqList(const int maxSize=c_defaultSize)
: m_maxSize(maxSize), m_size(0)
{
//检查参数合理性
assert(m_maxSize>=0);
m_data = new T[m_maxSize];
//memcpy(m_data, T(), sizeof(T)*m_maxSize);
assert(m_data);
}
//拷贝构造函数
template< class T >
SeqList::SeqList(const SeqList& rhs)
{
this->m_maxSize = rhs.m_maxSize;
this->m_size = rhs.m_size;
m_data = new T[m_maxSize];
//检查
assert(m_data);
assert(m_size>=0 && m_maxSize>=m_size);
for (int i=0; i
{
m_data[i] = rhs.m_data[i];
}
}
//析构函数
template< class T>
SeqList::~SeqList()
{
delete []m_data;
m_data = NULL;
}
//等号赋值
template< class T >
SeqList& SeqList::operator =(const SeqList& rhs)
{
this->m_maxSize = rhs.m_maxSize;
this->m_size = rhs.m_size;
delete []m_data;
m_data = new T[m_maxSize];
//检查
assert(m_data);
assert(m_size>=0 && m_maxSize>=m_size);
for (int i=0; i
{
m_data[i] = rhs.m_data[i];
}
return *this;
}
template< class T >
T& SeqList::operator [](const int index)
{
assert(index>=0 && index
return m_data[index];
}
//返回表的长度
template< class T >
inline int SeqList::Length(void) const
{
return m_size;
}
//查找x在表中的位置
//找到x返回所在位置的下标(范围是0到m_size-1)
//找不到返回-1
template< class T >
int SeqList::Find(const T& x) const
{
int i = 0;
while(i
{
i++;
}
if (i == m_size)
{
return -1;
}
else
{
return i;
}
}
//判断x是否在表中
//成功返回true,失败返回false
template< class T >
bool SeqList::IsIn(const T& x) const
{
if (Find(x))
{
return true;
}
else
{
return false;
}
}
//在index位置插入x,index从0开始
template< class T >
bool SeqList::Insert(T x, const int index)
{
if (index<0 && index>=m_maxSize)
{
return false;
}
if (m_size == 0)
{
m_data[m_size++] = x;
return true;
}
for (int i=m_size; i>index; i--)
{
m_data[i] = m_data[i-1];
}
m_data[index] = x;
m_size++;
return true;
}
template< class T >
bool SeqList::Remove(const T& x)
{
int index = Find(x);
if (index == -1)
{
return false;
}
else
{
for (int i=index; i
{
m_data[i] = m_data[i+1];
}
m_size--;
return true;
}
}
template< class T >
int SeqList::Next(const T& x) const
{
int index = Find(x);
if (index>=0 && index
{
return index+1;
}
else
{
return -1;
}
}
template< class T >
int SeqList::Prior(const T& x) const
{
int index = Find(x);
if (index>0 && index
{
return index-1;
}
else
{
return -1;
}
}
int main()
{
SeqList< int > temp(10);
SeqList< int > obj(temp);
for (int i=0; i<10; i++)
{
temp.Insert(i, 0);
}
temp.print();
temp.Remove(2);
temp.print();
temp.Remove(10);
obj = temp;
obj.print();
obj.~SeqList();
cout <
return 0;
}