《C++ Primer》读书笔记第三章-4-数组 And 多维数组

来源:互联网 发布:php论文范文参考5000字 编辑:程序博客网 时间:2024/06/08 07:07

笔记会持续更新,有错误的地方欢迎指正,谢谢!

声明:如果这一章看不下去,跳过吧!用vector就足够了!

数组

数组和vector非常类似,不同在于数组的大小固定,但对某些特殊的应用来说,程序的运行时性能较好,相应地也损失了一些灵活性。

定义数组:必须指定数组类型,不能使用auto由初始值推断;数组类型不能是引用。

定义和初始化内置数组

const unsigned sz = 3;int a1[sz] = {0, 1, 2}; //此类都属于列表初始化,含有三个元素的数组,元素值分别为0,1,2int a2[] = {0, 1, 2}; //与a1等价int a3[5] = {0, 1, 2}; //等价于a3[] = {0, 1, 2, 0, 0}string a4[3] = {"hi", "bye"}; //等价于a4[] = {"hi", "bye", ""}int a5[2] = {0, 1, 2}; //错误:初始值个数超咯!

总结:元素不足数组可以帮你补,维度不知道数组可以根据初始化的个数求得,但元素个数多了就要不得了!

接下来,字符数组:

char a1[] = {'C', '+', '+'}; //后面没有空字符;char a2[] = "C++"; //自动添加空字符;char a[3] = "C++"; //错误:维度不够,没办法存放空字符。

一个奇葩点:数组不允许拷贝赋值。即a1数组不能赋给a2数组。

复杂的数组声明:
能看懂的方法:有括号先看括号,括号看完后,再从右到左看。

  1. 数组和指针的结合型:
    int* ptrs[10]; //ptrs是数组,数组里面的元素类型是int *。
    int (*parray)[10]; //parray是指针,指向含有10个整型元素的数组。

  2. 数组和引用的结合型:
    int &refs[10] = ptrs;//错误,由于数组元素也是对象,所以不存在元素为引用的数组。
    int (&arrRef)[10] = arr; //arrRef是一个引用,引用了一个含有10个整数的数组。

  3. 数组和指针和引用的结合型:
    int *(&arry)[10] = ptrs;//首先看括号,括号里表示arry是个引用,括号看完了。
    //接下来从右往左看,引用的对象是一个大小为10的数组,最后看左边知道。
    //接下来再从右往左看,数组的元素的类型为int*。

访问数组元素

法一:下标;
法二:范围for循环。

指针和数组

数组在编译时,编译器会把它转换成指针。数组名就是指向该数组首元素的指针。
例子:

int a[] = {0, 1, 2};auto a2(a); //a是数组名,所以会被转化为指针,也就是说a2是指向整型的指针,a2指向a[0]。等价于auto a2(&a[0])。//但是,当使用decltype关键字时,上述转换不会发生:decltype(a) a3 = {3, 4, 5};//这里decltype返回整型数组int[3]。

标准库函数begin和end

使用标准库函数begin和end,遍历数组:

int arr[] = {0, 1, 2, 3};int *begin = begin(arr); int *end = end(arr) while(begin != end){    cout << *begin << endl;    ++begin ;}

注意:函数begin和end并不是容器中的函数begin和end,功能类似而已。

指针运算

\\超简单:int arr[5] = {1, 2, 3, 4, 5};int *p1 = arr;int *p2 = p1 + 3; //p2指向4\\给前四个数都加1while(p1 <= p2) //指针指的是同一个对象的才能比较{    ++(*p1);    ++p1;//移到下一个元素(至于要移多少位,不用我们操心,我们+1就好了。)}

解引用和指针运算的交互

名字牛逼狂甩屌炸天了,非常简单,看懂下面代码就行:
int arr[5] = {1, 2, 3, 4, 5};
int last = *(arr + 4); //last = 5,等价于int last = arr[4];

补充:标准库类型限定使用的下标都是无符号类型;而内置类型的下标无此要求。

C风格字符串

C++虽支持C风格的字符串,但最好别用。原因:1.不方便;2.是诸多安全问题的根本原因。用C++标准库的string就好了。
比如:
1. 别用cstring头文件。
2. char str[]={‘C’ , ‘+’ , ‘+’};就是C风格的字符串!别用!
3. 自然也用不到C语言标准库提供的strlen(p)、strcmp(p1,p2)等函数。这些函数只用于C风格的字符串,不可能用在C++的string中,大可放心好了!

与旧代码的接口

接个毛,千万别接,远离C风格字符串,珍爱生命!

后面两板块的总结:

  1. C++程序员应使用vector和迭代器,不使用内置数组(本质上就是指针)和指针;
  2. 应使用string,不使用C风格的字符串。

多维数组

本质:数组的数组。

int a[3][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} };//很好理解int b[3][4] = {0, 1, 2, 3, 4, 5,6, 7, 8, 9, 10, 11};//等价于aint c[3][4] = { {0}, {4}, {8} }; //显式地初始化每行的首元素,其他默认初始化为0int d[3][4] = {0, 3, 6, 9}; //显式初始化第一行,其他元素执行默认初始化

算了,不写了。还是多用vector吧,嵌套vector贼爽!
OVER!