多维数组
// 一维数组
int codes1[10] = {1,2,3};
// 二维数组
int codes2[5][10] = {{1,2},{4,5},{},{},{1,2,3,4,5,6,7,8,9,200}};
//{1,2,3,4,5,6,7,8,9,0,123/*codes2[1][0]*/};*/
cout << "codes2[1][0] = " << codes2[1][0] << endl; //4
cout << "codes2[4][9] = " << codes2[4][9] << endl; //200
// 三维数组
int codes3[5][10][100] = {{{1,2}/*codes3[0][0][...]*/,
{4,5}/*codes3[0][1][...]*/}/*codes3[0][...]*/,
{}/*codes3[1][...]*/};
cout << "codes3[0][0][1] = " << codes3[0][0][1] << endl; // 2
cout << "codes3[0][1][0] = " << codes3[0][1][0] << endl; // 4
// 数组赋值指定索引数据
codes1[0] = 123;
codes2[0][0] = 445;
codes3[0][0][2] = 234;
多级指针
int *p1 = codes1;
// int **pp2 = codes2; 语法报错
int **pp2 = (int**)codes2;
// cout << pp2[2][3] << endl; 虽然使用类型强制转换,语法不报错,但是调试会抛出异常,并不能使用强制类型转换后,通过指针使用数组
int *pp1 = new int;
int **ppp2 = (int**)new int[10][10];
// **ppp2 = 3; 使用类型强制转换,语法不报错,但是调试会抛出异常
// 多级指针正确赋值方法,使用指针数组赋值,且数组内每个成员必须new分配内存空间
int* xyz[10];
xyz[0] = new int;
*xyz[0] = 3;
int **pppp2 = new int*[10];
for(int i =0; i < 10;i++) {
*(pppp2+i) = new int[10];
}
**pppp2 = 203;
**(pppp2 + 1) = 100; // 指针+1,代表[1][0],并不是[0][1]
// cout << "**(pppp2 + 1) = " << pppp2[0][1] << endl; // 0
cout << "**(pppp2 + 1) = " << pppp2[1][0] << endl; // 100
数组模板array
// 数组和数组模板的区别
// 1. 数组和数组模板在后期初始化上不同
int codes1[3];
codes1[0] = 200;
array<int,size> codes;
codes = {200,300,400};
// 2. 数组的尺寸允许使用变量,但数组模板的尺寸不允许使用变量,但可以使用常量或数值
int size = 3;
int codes2[size];
const int size1 = 3;
// array<int,size> codes; 语法报错
array<int,size1> codes;
// 3. 数组在某种程度上可以当做指针使用,但数组模板不可以
int abc[3] = {1,2,3};
cout << "abc[0] = " << *abc << endl;
array<string, 5> productNames = {"iPhone6", "iPhone6 Plus"};
cout << "productNames [0] = " << productNames[0] << endl;
// 4. 数组模板可以更容易获取数组的尺寸
cout << "abc size is " << sizeof(abc)/sizeof(int) << endl;
cout << "productNames size is " << productNames.size() << endl;
// 5. 将数组赋给指针是引用复制,而数组模板之间的赋值是值的复制
int codes2[]{1,2,3};
int *pCodes = codes2;
pCodes[0] = 321;
cout << "codes2[0] = " << codes2[0] << endl; // 321
array<int , 3> codes1;
array<int,size> codes;
codes = {200,300,400};
codes1 = codes;
codes1[0] = 123;
cout << "codes1[0] = " << codes1[0] << endl; // 123
cout << "codes[0] = " << codes[0] << endl; // 200
// 不管是数组,还是数组模板,都不要超出最大的索引,超出索引会抛出异常,数组溢出
vector(动态数组)
vector可以作为数组或者栈使用
#include <vector>
vector<int> values;
// 动态添加三个元素
values.push_back(20);
values.push_back(40);
values.push_back(60);
// 删除指定的元素
values.pop_back(); // 出栈,删除最后一个元素
values.erase(values.begin()); // 删除第1个元素
values.erase(values.begin() + 1); // 删除第2个元素
// 遍历容器中所有元素
for(int n:values)
{
cout << n << endl;
}
for(long i = size - 1; i>=0;i--)
{
cout << values[i] << endl;
}
// 获取vector容器size,即存储了多少个元素
long size = values.size();
cout << "values size = " << size << endl;
// 获取指定索引的元素
cout << values.at(0) << endl;