C++实现顺序表的方法

 更新时间:2016年08月17日 09:48:19   作者:zgw285763054  
本文给大家带来了C++实现顺序表的方法,代码简单易懂,附有注释,感兴趣的朋友一起看下吧

废话不多说了,直接给大家上关键代码了。

#pragma once
#include <assert.h>
template<class T>
class SeqList
{
public:
SeqList()
:_a(NULL)
,_size(1)
,_capacity(1)
{}
SeqList(T* a, size_t size)
:_a(new T[size])
,_size(size)
,_capacity(size)
{
for (size_t i = 0; i < _size; ++i)
{
_a[i] = a[i];
}
}
//拷贝构造函数常规写法
/*SeqList(const SeqList<T>& s)
:_a(new T[s._size])
,_size(s._size)
,_capacity(s._capacity)
{
for (size_t i = 0; i < _size; ++i)
_a[i] = s._a[i];
}*/
//拷贝构造函数现代写法
SeqList(const SeqList<T>& s)
:_a(NULL)
{
SeqList<T> tmp(s._a, s._size);
swap(_a, tmp._a);
_size = s._size;
_capacity = s._capacity;
}
~SeqList()
{
if (_a)
delete[] _a;
}
//赋值运算符重载常规写法
SeqList<T>& operator=(const SeqList<T>& s)
{
if (this != &s)
{
T* tmp = new T[s._size];
for (size_t i = 0; i < s._size; ++i)
{
tmp[i] = s._a[i];
}
delete[] _a;
_a = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
//赋值运算符重载现代写法
/*SeqList<T>& operator=(SeqList<T> s)
{
if (this != &s)
{
swap(_a, s._a);
_size = s._size;
_capacity = s._capacity;
}
return *this;
}*/
public:
void Print()
{
for (size_t i = 0; i < _size; ++i)
{
cout<<_a[i]<<" ";
}
cout<<endl;
}
void PushBack(const T& x)
{
_CheckCapacity();
_a[_size++] = x;
}
void PopBack()
{
assert(_size > 0);
--_size;
}
void Insert(int pos, const T& x)
{
assert(pos >= 0 && pos <= _size);
_CheckCapacity();
int iIndex = _size;
while (iIndex > pos) //int和size_t比较为什么不行?
{
_a[iIndex] = _a[iIndex-1]; 
--iIndex;
}
_a[iIndex] = x;
++_size;
}
void Erase(size_t pos)
{
assert(_size > 0 && pos < _size);
size_t index = pos;
while (index < _size-1)
{
_a[index] = _a[index+1];
++index;
}
--_size;
}
int Find(const T& x)
{
for (size_t i = 0; i < _size; ++i)
{
if (_a[i] == x)
{
return i;
}
}
return -1;
}
T& operator[](size_t index)
{
assert(index >= 0 && index < _size);
return _a[index];
}
void Reserve(size_t size) //保留空间,增容到size
{
_capacity = size;
_a = (T*)realloc(_a, _capacity * sizeof(T));
}
void Clear() //不释放空间
{
_size = 0;
}
void Size()
{
return _size;
}
protected:
void _CheckCapacity()
{
if (_size+1 > _capacity)
{
_capacity = _capacity*2;
_a = (T*)realloc(_a, _capacity * sizeof(T));
}
}
protected:
T* _a;
size_t _size;
size_t _capacity;
};

以上所述是小编给大家介绍的顺序表的C++实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 浅析stl序列容器(map和set)的仿函数排序

    浅析stl序列容器(map和set)的仿函数排序

    有序的stl容器在工程中应用什么方便和广泛,但是当我们需要自己的排序的时候,可以用仿函数来设置它
    2013-09-09
  • C++11时间日期库chrono的使用

    C++11时间日期库chrono的使用

    chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,本文详细的介绍了一下如何使用,感兴趣的可以了解一下
    2022-01-01
  • C++超详细分析单链表的实现与常见接口

    C++超详细分析单链表的实现与常见接口

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,本章带你分析单链表的实现与常见接口
    2022-03-03
  • QT编写窗口插件实现调用窗口的自适应

    QT编写窗口插件实现调用窗口的自适应

    这篇文章主要为大家详细介绍了QT编写窗口插件实现调用窗口的自适应,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 分享常用的3个C++小技巧

    分享常用的3个C++小技巧

    这篇文章主要分享了常用的3个C++小技巧,
    2021-12-12
  • C/C++常用函数易错点分析

    C/C++常用函数易错点分析

    这篇文章主要介绍了C/C++常用函数易错点分析,包含了memset、sizeof、getchar三个常用函数的分析,需要的朋友可以参考下
    2014-08-08
  • 380行C++代码实现扫雷小游戏

    380行C++代码实现扫雷小游戏

    这篇文章主要为大家详细介绍了380行C++代码实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Qt中布局管理的使用小结

    Qt中布局管理的使用小结

    Qt的布局管理系统提供了简单而强大的机制,确保它们有效地使用空间,本文就介绍了Qt中布局管理的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C++ 两个vector对象拼接方式

    C++ 两个vector对象拼接方式

    这篇文章主要介绍了C++ 两个vector对象拼接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • EasyC++自动存储持续性

    EasyC++自动存储持续性

    这篇文章主要介绍了EasyC++自动存储持续性,下面文章围绕EasyC++自动存储持续性的相关资料展开全文资料,需要的小伙伴可以参考一下下面文章的具体内容,希望对你的学习有所帮助
    2021-12-12

最新评论