《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数组。
复杂的数组声明:
能看懂的方法:有括号先看括号,括号看完后,再从右到左看。
数组和指针的结合型:
int* ptrs[10];
//ptrs是数组,数组里面的元素类型是int *。int (*parray)[10];
//parray是指针,指向含有10个整型元素的数组。数组和引用的结合型:
int &refs[10] = ptrs;
//错误,由于数组元素也是对象,所以不存在元素为引用的数组。int (&arrRef)[10] = arr;
//arrRef是一个引用,引用了一个含有10个整数的数组。数组和指针和引用的结合型:
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\\给前四个数都加1:while(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风格字符串,珍爱生命!
后面两板块的总结:
- C++程序员应使用vector和迭代器,不使用内置数组(本质上就是指针)和指针;
- 应使用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!
- 《C++ Primer》读书笔记第三章-4-数组 And 多维数组
- 《C++ Primer》读书笔记-第三章 06 多维数组
- 《C Primer Plus 5th》读书笔记-----指针和多维数组
- c++primer之多维数组
- 《C++ Primer》读书笔记-第三章 05 数组
- c++primer笔记--3.6多维数组
- C++primer学习笔记-----3.6多维数组
- c++primer 第三章数组 string vector
- 第三章 3.6 多维数组
- c++ primer第五版(中文)习题答案 第三章第六节-多维数组
- 《C++primer》读书笔记---数组和指针
- c++primer学习笔记(4.4)多维数组
- c primer plus 指针与多维数组探究
- c++primer第三章字符串,vector,数组小结-3
- C++primer 4.4 多维数组、指针数组、数组指针(未完)
- 多维数组转一维数组(C)
- C多维数组
- c.传递多维数组
- HDU-2476(区间DP)
- MySQL 添加用户
- POJ
- 水经微图下载与安装教程
- 远程桌面xfce4 中 tab 补全键 冲突
- 《C++ Primer》读书笔记第三章-4-数组 And 多维数组
- C#开发XML WebService接口(SOAP)
- [笔记分享] [DT] device tree之属性
- InnoDB存储引擎--3、分布式事务XA
- [JAVA] Spring AOP API简述
- JAVA反射与注解
- iOS 关于视频录制实现 (仿微信)
- 1041. Be Unique (20)
- javawebday02补充(css简介 js简介 style 键:值 ;)