一、数组的优点,缺点
特点:数组的内存是连续的
-
优点
下标访问(随机访问)时间复杂度是O(1)
末尾位置增加删除元素时间复杂度是O(1)
访问元素前后相邻位置的元素非常方便 -
缺点
非末尾位置增加删除元素需要进行大量的数据移动O(n)
搜索的时间复杂度
无序数组-线性搜索O(n)
有序数组-二分搜索O(logn)
数组扩容消耗比较大
扩容
二、具体实现
1.接口
代码如下(示例):
//末尾增加元素
void push_back(int val);
//末尾删除元素
void pop_back();
//按位置增加元素
void insert(int pos,int val)
//按位置删除
void erase(int pos);
//元素查询
int find(int val);
//打印数据
void show()const;
2.完整实现代码
代码如下(示例):
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
//数组实现
class Array {
public:
Array(int size = 10) :mCur(0), mCap(size)
{
mpArr = new int[mCap]();
}
~Array()
{
delete[] mpArr;
mpArr = nullptr;
}
public:
//末尾增加元素
void push_back(int val)
{
if (mCur == mCap)
{
expand(2 * mCap);
}
mpArr[mCur++] = val;
}
//末尾删除元素
void pop_back()
{
if (mCur == 0)
{
return;
}
mCur--;
}
//按位置增加元素
void insert(int pos, int val)
{
if (pos<0 || pos>mCur)
{
return;//throw "pos invalid!";
}
if (mCur == mCap)
{
expand(2 * mCap);
}
//移动元素
for (int i = mCur - 1; i >= pos; i--)
{
mpArr[i + 1] = mpArr[i];
}
mpArr[pos] = val;
mCur++;
}
//按位置删除
void erase(int pos)
{
if (pos < 0 || pos >= mCur)
{
return;
}
for (int i = pos; i < mCur; ++i)
{
mpArr[i] = mpArr[i+1];
}
mCur--;
}
//元素查询
int find(int val)
{
for (int i = 0; i < mCur; i++)
{
if (mpArr[i] == val)
{
return i;
}
}
return -1;
}
//打印数据
void show()const
{
for (int i = 0; i < mCur; i++)
{
cout << mpArr[i] << " ";
}
cout << endl;
}
private:
//内部数组扩容接口
void expand(int size)
{
int* p = new int[size];
memcpy(p, mpArr, sizeof(int) * mCap);
delete[]mpArr;
mpArr = p;
mCap = size;
}
private:
int* mpArr; //指向可扩容的数组内存
int mCap; //数组的容量
int mCur; //数组有效元素个数
};
int main() {
Array arr;
srand(time(0));
for (int i = 0; i < 10; i++)
{
arr.push_back(rand() % 100);
}
arr.show();
arr.pop_back();
arr.show();
arr.insert(0, 100);
arr.show();
arr.insert(10, 200);
arr.show();
int pos = arr.find(100);
if (pos != -1)
{
arr.erase(pos);
arr.show();
}
}
总结
今天主要给大家手写了,线性表数组,主要应用了动态数组,对数组进行增删查。大家如果能够自己写具体实现就更好了。