数组是 线性表的数据结构,利用一组 连续的内存空间存储一组具有 相同类型的数组。也正因为这种特性使得数组在内存上的存储有一定的限制, 无法利用零碎的内存空间存储某些数据。
数组的时间复杂度
-
数组因为支持随机访问,根据数组下标的随机访问使得其时间复杂度为O(1)
-
数据插入:假定数组的长度为N,当需求将某个数据插入到K(k<n)位置上时,前K个位置的数据位置维持原样保持不变,但K~N位置的数据需要往后移一个位置给该数据,因此虽然读取K位置的数据方便,但是在插入阶段使得要经过一个内存拷贝的过程。当利用极限的思维去考虑,假设在第1位插入的话,那么N个数据都将往后移一位,所以最坏的时间复杂度是O(n),最好情况下则是插入在末端,一个数据都不会后移拷贝,最好的时间复杂度为O(1),利用数学期望计算平均的时间复杂度则为(1+2+3+4+···+n)/n = O(n)。
-
数据删除:与数据插入类似,在删除任意位置的数据后需要将该数据后的数据部分向前拷贝一步,维持数组内存位置连续的要求,因此最坏的时间复杂度O(n),最好的时间复杂度O(1),平均时间复杂度为O(n)。
容器与数组
C++的STL库中有vector容器,将数组的很多细节封装起来,在使用的时候可以放心使用也不用过分担心内存泄漏相关的问题,但是不是有了vector容器就直接抛弃掉数组了呢?
-
传统数组在使用过程中需要预先指定内存大小,当超出边界后则需要重新申请内存,复制过去才能重新插入,vector则使这一操作简单化,动态扩容使数据操作变得简单,而且对数据的实现细节也能够得到较好的封装,大部分情况下业务开发,使用容器的确能够达到一劳永逸的效果。
-
如果数据大小已知,并且相关的数据操作较简单,就没必要动用容器vector,并且在底层开发时需要优化性能,在尽量不用容器的情况下,适当使用数组也是可以的。
手动实现数组功能
#pragma once
#include<iostream>
class ARRAY
{
private:
int size;
int used;
int* arr;
public:
//默认构造函数
ARRAY(int s = 0);
//复制构造函数
ARRAY(const ARRAY& AR);
//析构函数
~ARRAY() {
delete[]arr; }
//重载赋值运算符
void operator=(const ARRAY& AR);
//打印所有数组元素
void dump();
//插入元素
bool insert(int elem);
//搜索值元素
void search(int num);
//删除某个元素
bool deleteelem(int num);
//显示数组首地址
void showadd();
};
#pragma once
#include"array.h"
#include<cstring>
using namespace std