数组作为数据结构中最简单最常用的数据结构,很值得学习一下,本文将从数组的概念,数组的特点,数组的优缺点,数组的代码实现详细讲解数组相关知识,在文章的最后也列举了一些经典的数组算法题,可以作为材料学习。
1. 数组的概念
C语言中,一组数据的集合称为数组。比如我们知道的字符串string就属于一个字符数组,只不过在数组的尾部加了个'\0'。
2. 数组的特点
- 内存连续
- 数据类型一致
3. 数组的优缺点
- 优点
- 内存连续,支持随机访问,时间复杂度为O(1)
- 缓存命中率高,按存储顺序访问效率高
- 缺点
- 内存连续,非末尾增删慢,时间复杂度为O(n)
- 静态数组容易不好控制大小,动态数组扩容开销太大
4. 数组的代码实现
#include <iostream>
#include <cstring>
#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); // O(n)
}
mpArr[mCur++] = val; // O(1)
}
// 末尾删除元素
void pop_back()
{
if(mCur == 0)
{
return;
}
mCur--; // O(1)
}
// 按位置增加元素
void insert(int pos,int val)
{
if(pos < 0||pos > mCur)
{
return; // throw "pos invalid";
}
if(mCur == mCap)
{
expand(2*mCap);
}
// 移动元素 O(n)
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;
}
// O(n)
for(int i = pos + 1;i < mCur;i++)
{
mpArr[i - 1] = mpArr[i];
}
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()
{
cout << "1" << endl;
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();
}
}