【C++】6.数组vector和字符串[深蓝学院C++第4章]
一.数组
1.1引入
数组:将一到多个相同类型的对象串连到一起,所组成的类型。
int b[10]
初始化方式:
(1)缺省初始化,函数内部是初始化为随机值,全局域中是初始化为0;
(2)聚合初始化,通过大括号来定义每个元素,缺省的元素初始化为0;
注意事项:
(1)不能使用auto来声明数组类型;
(2)数组不能复制;
(3)元素个数必须是一个常量表达式;
(4)字符串数组的特殊性;char str[]="Hello"自带\0结束,而char str[]={'H','e','l','l','o'};不带\0结束
1.2数组的复杂声明和引用
int* a[3],3个指针的数组,
int(*a)[3],指向3个int数组的指针,a是一个指针,*解引用之后发现它指向一个int[3],
int b[3];int(&a)[3]=b;//a是对b的引用,可以定义数组的引用
不能定义引用的数组
1.3数组的元素访问
x[y]->*(x+y)->y[x],小心溢出问题
数组对象是一个l-value,并不是等号左边的意思,而是locator-value,不能修改。
1.4从数组到指针
数组到指针的隐式转换:
(1)使用数组对象时,通常情况下会产生数组到指针的隐式转换;int a[3];auto b=a;此时b就是int*,指向a的首地址;
(2)隐式转换会丢失一部分类型信息,丢失了数组的长度信息;
(3)可以通过声明引用来避免隐式转换,auto& b=a;
(4)注意,不要使用extern指针来声明数组;
获得指向数组开头与结尾的指针:std::(c)begin(arrayName),std::(c)end(arrayName),//待c的是获取const int*
指针算数:
(1)增加、减少
(2)比较
(3)求距离
(4)解引用
(5)指针索引
1.5其他操作
int a[3];
元素个数:
(1)sizeof //sizeof(a)=3*4,是一种c语言的方式,有一定的计算逻辑风险
(2)std::size //std::size(a)=3,是C++提供的方法
(3)end-begin //end-begin=3,但end和begin是运行时值,可能有计算逻辑风险
元素遍历
(1)基于元素个数
(2)基于begin、end
(3)range-based for循环,C++11引入的语法糖
1.6C字符串
char str[]="Hello" //char[6]类型,
C字符串本质上也是数组
C语言提供了额外的函数来支持C字符串相关的操作:strlen、strcmp
1.7多维数组
int a[3][4];
本质:数组的数组
初始化:一层大括号 V.S. 多层大括号
索引与遍历:使用多个中括号来索引,使用多重循环来遍历
指针与对维数组:
(1)多维数组可以隐式转换为指针,但只有最高维会进行转换,其它维度的信息会被保留
(2)使用类型别名来简化多维数组指针的声明
(3)使用指针来遍历多维数组
1 void test(){ 2 int x2[3][4]; 3 auto ptr = std::begin(x2); 4 while(ptr!=std::end(x2)){ 5 auto ptr2 = std::begin(*ptr); 6 while(ptr2!=std::end(*ptr)){ 7 std::cout << *ptr2 << std::endl; 8 ptr2++; 9 } 10 ptr++; 11 } 12 }
二.vector
vector是标准库中定义的一个类模板。
易用性:可复制、可运行期动态修改元素个数
构造与初始化:聚合初始化、逐个塞入、指定容量并使用默认值、指定容量和初始值
其他方法:获取元素个数、判空、插入删除元素(push_back\pop_back)、比较等等
2.1遍历与索引
(1)[]和at,[]可能会越界、at可以校验是否越界
(2)begin/end方法
尤其是迭代器,模拟指针的行为:
(2)解引用和下标访问,
(3)可以移动,
(4)两个迭代器相减求距离,
(5)两个迭代器相比较,
2.2其他
修改元素数量可能会使得迭代器失效;
多维vector
从.到->操作符,.用在对象上,->用在对象的指针上
vector内部定义的类型:size_type、iterator
三.字符串
string是C++标准库中定义的一个类模板特化别名,用于替代内建字符串
3.1易用性
可复制、可在运行期动态修改字符个数
3.2其他方法
长度、判空
比较
赋值
拼接
索引
转为c字符串.c_str()

浙公网安备 33010602011771号