目录
1.iterator
2.数组
1.iterator
迭代器就是个内置指针,可以++ -- ,可以解引用。
迭代器分两种类型 iterator 和const_iterator(只读,不能修改)
迭代器要用作用域限定类型
vector<int>::iterator it; 如果不限制,编译器不知道这个指针是什么类型的,也就无法跳和解引用。
auto it=v.cbegin();
auto it1=v.cend(); 表示迭代器 就是const_iterator类型的
.的优先级比*高,迭代器中没用empty方法 string对象才有empty方法
为什么?因为vector的capacity如果扩大了的话,它可能会异地扩容,迭代器内部的指针指向原来的地址就无效了
二分查找
2.数组
要求数组长度必须是常数,这种const 的常变量也可以当成常数
如果要用函数的返回值来初始化数组的大小,那么只能返回类型为constexpr的才能初始化带大小
int不完全初始化的后面为0
string不完全初始化的后面为"" 也就是空字符串
字符的初始化
字符串自动包含了空字符\0。
从右往左读,从里往外读
优先级[ ]>*
int &arr[10] 错误,因为从右往左先知道他是一个10个元素的数组,数组中装了10个int & 引用,我们知道数组只能装对象,不能装引用,所以错误了。
vector的下标>=0
但是数组的下标可以为负数,如果指针指到一个大的数组的中间,那么p[-1]也是有意义的
C风格的字符串
多维数组
出错误
范围for遍历二维数组,那第一层行数的时候一定要加引用&,而第二层根据是否要修改加&,要修改必须加&,如果不涉及修改的话加不加都可以
二维数组与指针
int arr[3][4]中
arr类型是int(*)[4] (是一个指针,指向四个包含元素的数组,数组指针)
arr[0]类型是int * (因为arr[0][0]类型是int)
int (*p)[4]=arr; 对,arr就是个int(*)[4]的指针
接上行,p=&arr[0];(arr[0]表示的是第一行的整个数组,对他取地址取的就是4个数据的地址,原本arr[0]的类型是int* ,再取4个int的地址就是int(*)[4])
上面另一种理解:arr[0]是*(arr+0) ,所以&*(arr+0)=(arr+0) ,arr+0是int(*)[4]类型
遍历二维数组
第一层循环arr1类型是int(*)[4] ,p的auto推断为int(*)[4]
第二层循环*p后为一行四个元素的数组,int [4] ;*p代表的是数组那一行首元素的地址
q的类型是int *