2020.12.18 学习笔记,未完待续。
即将硕士毕业从事C++开发人员,修炼内功,欢迎纠错与讨论。
动态数组(C++)
一、什么是数据结构?
数据结构是计算机存储、组织数据的方式
二、线性表
线性表是具有n个相同类型元素的有限序列(n ≥ 0)
- a1是首结点(首元素),an是尾结点(首元素)
- a1是a2的前驱,a2是a1的后继
常用的线性表有:
- 数组
- 链表
- 栈
- 队列
- 哈希表(散列表)
三、数组(Array)
数组是一种顺序存储的线性表,所有元素的内存地址是连续的
int *array = new int[3]{ 11, 22, 33 };
在很多编程语言中,数组都有个致命的缺点:
- 无法动态修改容量
四、动态数组(Dynamic Array)
1、动态数组接口设计
动态数组一般需要下面的这些接口。
代码如下:
template<class T>
...
int size(); //元素的数量
bool isEmpty(); //是否为空
bool contains(T element); //是否包含某个元素
void pushBack(T element); //尾端添加元素
T at(int index); //返回index位置对应的元素
T set(int index, T element); //设置index位置的元素
void add(int index, T element); //往index位置添加元素
T remove(int index); //删除index位置对应的元素
int indexOf(T element); //查看元素的位置
void clear(); //清楚所有元素
...
2、构造函数与析构函数
无参构造调用有参构造,如果构造动态数组的空间小于默认空间,则以默认空间构造动态数组。
代码如下:
template<class T>
MyArray<T>::MyArray():MyArray(DEFAULT_CAPACITY){}
template<class T>
MyArray<T>::MyArray(int capacity)
{
mSize = 0;
mCapacity = (capacity > DEFAULT_CAPACITY) ? capacity : DEFAULT_CAPACITY;
mElements = new int[mCapacity];
}
template<class T>
MyArray<T>::~MyArray()
{
delete[] mElements;
mElements = nullptr;
}
3、元素数量
template<class T>
int MyArray<T>::size()
{
return mSize;
}
4、是否为空
如果mSize==0,则数组为空。
template<class T>
bool MyArray<T>::isEmpty()
{
return mSize == 0;
}
5、根据索引查看元素
首先索引检查,索引越界抛出索引。
template<class T>
void MyArray<T>::checkIndex(int index)
{
if (index < 0 || index >= mSize)
throw index;
}
然后,根据索引查看数组元素。
template<class T>
T MyArray<T>::at(int index)
{
checkIndex(index);
return mElements[index];
}
6、设置元素
检查索引,替换索引位置的元素。
template<class T>
T MyArray<T>::set(int index, T element)
{
checkIndex(index);
mElements[index] = element;
return element;
}
7、查看元素位置
遍历数组,找到元素返回位置;
找不到返回-1(ELEMENT_NOT_FOUND)
template<class T>
int MyArray<T>::indexOf(T element)
{
for (int i = 0; i < mSize; i++)
{
if (element[i] == element)
return i;
else
return ELEMENT_NOT_FOUND;
}
}
8、包含元素
根据查看元素位置,如果包含则不等于-1.
template<class T>
bool MyArray<T>::contains(T element)
{
return indexOf(element) != ELEMENT_NOT_FOUND;
}
9、清除所有元素
设置mSize = 0
template<class T>
void MyArray<T>::clear()
{
mSize = 0;
}
10、打印数组-重载<<
//类外实现 输出流<<重载
template<class T>
ostream& operator<<(ostream& arrcout, MyArray<T>& arr)
{
for (int i = 0;i<arr.size();i++)
{
arrcout << arr.at(i) << " ";
}
return arrcout;
}
11、删除元素
从前往后,向前覆盖
template<class T>
T MyArray<T>::remove(int index)
{
checkIndex(index);
int old = mElements[index];
for (int i = index; i < mSize; i++)
{
mElements[index] = mElements[index+1];
}
mSize--;
return old;
}
12、添加元素
从后往前覆盖
template<class T>
void MyArray<T>::add(int index, T element)
{
if (index < 0 || index > mSize)
throw index;
for (int i = mSize - 1; i >= index; i--)
{
mElements[i + 1] = mElements[i];
}
mElements[index] = element;
mSize++;
}