数组和容器
定义
相同数据类型的数据的集合
语法
int array[3] { };
本质
数组按照所申请的数据类型,向操作系统申请了一块连续的内存空间。如果数组没有初始化,那么数组内元素的值就不知道为多少,可能变成内存本来就存在的值
基于数组的循环
目标:打印出数组所有元素
C+=11新语法:
for(变量类型 变量名称:数组)
{
循环内容
}
变量名称就代表了数组中的元素
变量类型可以和数组类型不相同
for(int x: array)
{std::cout<<x;
}
二维数组在内存中的模拟状态
int array[2][3]
array[0][0] |
array[0][1] |
array[0][2] |
array[1][0] |
array[1][1] |
array[1][2] |
数组越界漏洞
数组的本质是向操作系统申请一块连续的内存,而数组越界是访问了不该访问的地方,就会造成可能导致程序崩溃、丢失系统控制权等问题,比如array[3]={1,2,3},访问array[5]就是越界访问
std::array
介绍
array是一种容器,不仅仿照原生数组功能,另外加入了新的功能,std::array如果没有初始化,里面的值就可能会是内存之前已经存在的值
起源
由于原生数组存在越界漏洞等安全问题,C++提供了容器,std::array里面的at方法可以避免越界漏洞,当越界访问时,原生数组可能报错,可能不会,而std::array肯定会报错。
语法
引入头文件<array>
std::array<int,2>studentA
std::array<元素类型,元素个数>变量名
常见用法
size() : 返回元素个数
fill(100) : 将元素都设置成100
at():访问某个位置的元素
studentA.size();
studentA.fill(100);
studentA.at(0);
区别
std::array声明两个数组后,进行比较,两个数组相等
而有相同元素的原生数组不相等
std::vector
动态数组,也可以使用size 方法,std::vector如果没有初始化,系统会自动初始化里面的元素值为0
语法
引入头文件<vector>
std::vector<数据类型>变量名
例
std::vector<int>studentA
std::vector<int>studentA { 1,2,3 }
std::vector<int>studentA(5)里面有5个元素
std::vector<int>studentA(5,100)里面有5个元素,每个元素初始值为100
常见用法
at()、size()等,用法都是一样的
新增用法:
push_back 添加新元素
assign(3,100) 重新声明数组元素为3个,每个值为100
clear() 清空所有元素
empty() 确定是否为空,如果为空,则输出1,否则为0
数组和结构体的组合
struct Role
{int Hp;int damage;int Mp;bool bcase;
}
Role role[2]
{{100,200,200,1},{200,200,200,0}
}
//访问
role[0].Mp+=100;