gg学习总结,欢迎指正错误
数组(Arrays):
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
一.一维数组:
1.数组声明:
arraysize 必须是一个大于零的整数常量,type 可以是任意有效的 C++ 数据类型
type arrayname [arraysize]
例:
此时声明了一个大小为100 int的数组a
int a[100];
2.数组初始化:
int a[10]={1,2,3,4,100};
//此时数组前五位被初始化,后五位未初始化会被分配为0
3.数组访问:
数组下标从0开始,此时令
a[1]=666;
得
二.二维数组:
1.数组声明:
row是行数,column是列数
type arrayname[row][column]
例:
int a[3][10];
此时声明了一个3行10列的二维数组a;
二维数组在内存上仍然是连续的;
2.数组初始化:
int a[3][10]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
若为:
int a[3][10]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
3.数组访问:
a[2][6]=666;
三.多维数组:
1.声明:
type arrayname[size1][size2][size3]...[sizen];
四.数组与指针:
有空再写
五.变长数组(注意,VS系列编译器均不支持该特性):
在学习普通数组后,我们发现普通数组只能在声明时用常量或常量表达式指定数组的长度,这并不利于解决问题;
有时在写程序时,我们并不知道之后需要多大的空间;有令一种办法;
在c99标准中,新增了可变长度数组;变长数组中的“变”不是指可以修改已创建数组的大小,一旦创建了变长数组,它的大小则保持不变。这里的“变”指的是:在创建数组时,可以使用变量指定数组的长度。
所以我们可以根据输入的n来声明数组大小;
int n;
cin>>n;
int a[n];
六.动态数组:
我们又可以发现数组在声明过后便不可以改变大小;
所以有另一种办法;动态数组
1.c
其本质是一些内存管理函数;一维malloc,二维calloc;
-
数组建立:
int a[n]可以改为
具体const可以看我另一篇总结
-
改变大小:
若改变大小用realloc;
这样a大小就变成了n+1;
a=(int*)realloc(a,sizeof(int)*(n+1));
-
释放内存:
在用完后记得用free释放内存;
free(a);
函数原型:
void free(void* p);
功能:释放void * p所指的内存空间
2.c++
在标准c中,动态内存分配函数包括malloc()、calloc()、realloc()和free()。c++不是采用库函数调用的方法,而是采用更加高级的方法——被集成进c++中的动态存储分配,使用关键字new和delete。
-
创建
int size;
int*a=new int[size];
-
改变大小
int *newa = new int[newsize]; // 创建新的内存空间
memcpy(newa, a, sizeof(int) * newsize); // 复制原有数据到新的内存空间
delete[] a; // 释放原有内存空间
a = newa; // 将新的指针赋值给原有指针
a[size++] = i; // 添加元素
-
释放内存
delete []a;
七.vector
vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。
头文件:
include <vector>
创建:
此时创建了一个储存int类型的空vector容器a
std::vector <int> a;
初始化:
std::vector <int>a(5);
//包含5个整数,每个值为默认值0
std::vector <int>a(5,6);
//包含5个整数,每个值为6
std::vector <int>a={1,2,3,4,5}
//包含5个整数,值分别为1,2,3,4,5
改变大小:
-
增加元素:
将1添加在数组a末尾
a.push_back(1);
-
删除元素:
删除第3和4位元素
a.erase(a.begin()+2);
a.erase(a.begin()+3);
//a.begin()返回的是数组首元素的地址
a.erase(a.begin()+2,a.begin()+3)
//也可删除范围内元素
-
清空:
a.clear();
访问:
可以和普通数组一样,或用函数访问
a[1]=6;
a.at(1)=6;
同时若想遍历数组也可用迭代器,迭代器可看我另外文章;