数组基础
2017-01-22 16:57
183 查看
1.数组与vector
数组 | vector | |
容器大小 | 必须固定 | 自由添加 |
性能 | 对于某些应用起来性能较好 | 对于某些应用起来性能较差 |
引用对象 | 元素不允许存放引用对象 | 元素不允许存放引用对象 |
定义和初始化 | 默认初始化,有元素 | 默认初始化,为空没有元素 |
列表初始化 | 列表初始化 | |
指定数量初始化,同默认初始化,无法指定初始化值 | 指定数量和值初始化, | |
访问元素 | 下标:range for | 下标:range for |
迭代器 | 指针 | |
基础定义和默认初始化
a[d] 表示数组名字为a,维度/容量为d,
维度在编译的时候就已经定了
维度不能在程序运行时被改动--->d 必须是一个常量或者常量表达式
默认初始化
数组在定义的时候就会被初始化:int arr[10]
内置类型的说明
内置类型就是那些C++已经自带的类型:int char float 等
推广到标准库的类型:string, vector等
auto关键字在数组中
定义数组必须是明确的对象类型
不允许使用auto来定义或者初始化数组
:auto a[10]
数组对象无法存放引用对象 int &a[10]
数组显示初始化
列表初始化可以忽略数组的维度,int a[] = {0,1,2,3}
编译器会根据列表初始值的数量来推断出来
需要注意指明了维度的列表初始化
如果指明了维度,在列表初始化中数量不能超过维度的大小
如果列表初始化中数量小于维度,剩下的被初始化为默认值
需要注意标准C++对于数组拷贝和赋值支持
不允许拷贝初始化
int a[] = {1,2,3}
int a2[] = a; error
不允许“=”赋值
a2 = a; error
字符数组
需要注意字符数组一定要结尾处有一个空字符字符数组的初始化
列表初始化
char a1[] ={'C','+','+'}
字符串初始化
char a2[] = "C++" //含有4字符,最后面有一个空字符
复杂复合类型数组的申明
指针数组
其表述有一定的问题,可以理解为指针的数组,
用来存放指针的数组
定义的格式 int *ptrs[10]
具体理解
从右往左来分析:首先是大小为10的数组,
然后名字是ptrs,数组元素的类型是int类型的指针
ptrs是一个含有10个整形的指针数组
数组指针
可以理解为数组的指针,其实是一个指针,但是这个指针指向的是数组
定义格式:int (*parray)[10]
具体理解
数组最好是由内向外来理解,首先是圆括号里面是一个指针,
右边是是指向大小为10的数组指针,
左边是可知数组的元素类型是int,
parray是一个指向含有10个整数的数组
引用数组,理解为存放引用的数组,这个不允许的
引用没有具体的内存,不是对象
int
&refs[1]
数组引用,数组的引用,主要是定义引用,其类型是一个数组
int (&refarray)[10]
数组最好是由内向外来理解,首先是圆括号里面是一个引用,
右边是大小引用对象时一个大小为10的数组,
左边是可知数组的元素类型是int
rarr是一个引用含有10个整数的数组
实例练习:
实例数组的定义,尤其是维度常量的使用,auto和引用的错误使用
数组列表初始化的实例,注意维度和列表范围之间的关系,拷贝和赋值的错误使用
字符数组类型
复杂数组类型的实例
int a[10];
string sa[10];
void main()
{
#pragma region 实例数组的定义,尤其是维度常量的使用,auto和引用的错误使用
//迭代器begin和end是两个关键的位置元素
//尤其end并不是最后一个元素,而是最后一个元素后面的一个位置,并不是元素
unsigned int d = 10;
//int arr[d];//err 指定数组大小的时候必须是一个常量
const unsigned cd = 10;
int arr2[cd];
int arr3[10];
string sa1[cd];
//默认初始化数组的值
for (auto i : arr2)
{
cout << i << " ";
}
cout << endl;
for (auto i : sa1)
{
cout << i << " ";
}
cout << endl;
//全局变量数组的默认初始化
for (auto i : a)
{
cout << i << " ";//初始化为0
}
cout << endl;
for (auto i : sa)
{
cout << i << " ";
}
cout << endl;
#pragma endregion
#pragma region 数组列表初始化的实例
int barr[3] = { 1, 2, 3 };
int barr2[] = { 1, 2, 3 };
int barr3[5] = { 1, 2, 3 };//多出来的数组会被默认初始化为0
//int barr4[2] = { 1, 2, 3 };//err 列表初始化的时候必须要在数组大小范围内
for (auto i : barr3)
{
cout << i << " ";
}
cout << endl;
//int barr4[] = barr;//err 数组不允许拷贝或者赋值
//int barr5[] = { 1, 2, 3 };
//barr5 = barr2;
#pragma endregion
#pragma region 字符数组类型
//一定要注意其后面必须有一个/0作为结束符
char carr1[] = "Wall.E";
for (auto i : carr1)
{
cout << i << " ";
}
cout << endl;
//char carr1[6] = "Wall.E";//err 大小不匹配,记得结束符
#pragma endregion
#pragma region 复杂数组类型的实例
int darr[10];
int *ptrInt[10];//是一个数组,数组存放10个int类型的指针
//int &refInt[10];//err 数组无法存放引用类型
int(*pArry)[10] = ↓//是一个指针,指向的是大小为10的int类型数组
int(&refArry)[10] = darr;//是一个引用,引用的是大小为10的int类型数组
#pragma endregion
system("pause");
return;
}
3.访问数组元素
数组下标下标的类型:size_t 是一个无符号类型
可以使用 range for来访问数组
使用下标需要注意的地方
要判断其是否在数组范围内,不要越界
实例练习:
使用数组来统计分数
数组下表的类型的实例
#pragma region 使用数组来统计分数
int grade[11] = {};
int score;
int index = 0;
while (cin >> score)
{
if (score<=100)
{
++grade[score / 10];
index++;
}
if (index >10)
{
break;
}
}
for (auto i: grade)
{
cout << i << endl;
}
#pragma endregion
#pragma region 访问数组,注意下标的范围
const size_t arrary_size = 10;
int ia[arrary_size];
//这里注意数组的范围是是从0开始的,如果大小10的数组,其范围是0-9
for (size_t i = 0; i < arrary_size; i++)
{
ia[i] = i;
cout << i << endl;
}
int ia2[arrary_size];
for (size_t i = 0; i < arrary_size; i++)
{
ia2[i] = ia[i];
cout << ia2[i] << endl;
}
vector<int> v1{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
vector<int> v2(v1);//使用vector进行拷贝的是时候是可以直接赋值初始化的
#pragma endregion
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- 快速解决C# android base-64 字符数组的无效长度问题
- C#中数组、ArrayList和List三者的区别详解
- C# 拷贝数组的几种方法(总结)
- C#动态调整数组大小的方法
- Lua中调用C++函数示例
- 详解Lua中的数组概念知识
- Lua教程(一):在C++中嵌入Lua脚本
- Perl中的列表和数组学习笔记
- Lua教程(二):C++和Lua相互传递数据示例
- jQuery 判断是否包含在数组中Array[]的方法
- 浅谈C#各种数组直接的数据复制/转换