本文是计划花一些时间学习《代码随想录》时做一个记录,水平有限,可能理解有误,内容摘抄总结自Carl大佬的 链接: 数组 感谢大佬开源的面向算法初学者的好资料
数组理论基础
大家如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
实际操作的时候,vector容器的内存地址与array相似也是连续的,每个元素4个地址
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1 = vector<int>(10);
int arr1[10];
cout << &arr1[0] << " " << &arr1[1] << " " << &arr1[2] << endl;
cout << &vec1[0] << " " << &vec1[1] << " " << &vec1[2] << endl;
system("pause");
return 0;
}
数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。与链表相对比,链表的内存空间地址不是连续的,但是我们在删除的时候更简单,复杂度为o1,然而随机访问的困难就会变大。
在使用string类型时,24B内部留有16B的存储空间用来存储数据,当数据过长的时候,用16B在堆中寻址,将内容存在堆中,以保持string类型等长
数组空间连续
连续的内存空间使得内存中的碎片减少,增加内存使用率
对于一维数组来说,无论多长,动态分配或者静态分配,在存储空间上一定是连续的,数据过长无法在内存上找到连续的空间,就会报错。
对于多维数组来说,都用new生成,同一个new底下的空间是连续的,如果静态定义多维数组,那么整个都是连续的(对于vector<vector<>>来说也是一样的,同样不连续)
如果想要申请连续的,(1)可以利用辅助变量控制每行的位置,申请一维数组。(2)可以先申请,然后再改变数组头的地址,(编码比较繁琐,且担心会冲掉旧数据)