【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()

 
posted @ 2023-02-12 19:38  啊原来是这样呀  阅读(34)  评论(0)    收藏  举报