Warning: 自家学习专用__by Arthur
Noun
- string:标准库类型(*include ),可变长,支持下标和迭代器,
- vector(类模板):标准库类型(*vector),可变长,支持下标和迭代器,存储对象(相同类型)而非引用,支持‘=’ 和 ‘==’操作;只能用push_back()添加元素;
- array:内置类型,固定长,支持下标(但是,指向数组元素的指针拥有更多的功能(用到与迭代器同名的库函数begin()和end()),vector和string的迭代器支持的运算,数组的指针全部支持————指针也是迭代器,只是使用方式不同), 存储对象(相同类型)而非引用,不允许拷贝和赋值;
- 迭代器(iterator):类似于指针类型,迭代器提供了对对象的间接访问;和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员,拥有begin和end成员,支持解引用操作,如:
std::vector<int> vec = {110,1,2,3,4,5,6,7,8,9};
auto b = vec.begin();
auto e = vec.end();
int aa = *b; //解引用b,获取vec[0],并初始化aa, 初始值为110
if(b->enpty()){} //判断b是否为空,使用 -> 访问成员函数
- 模板:模板本身不是类或者函数,相反可以将模板看作为编译器生成类或函数编写的一份说明。编译器根据模板创建类或者函数的过程称为实例化(instantiation);重要特征:在模板后面跟一对尖括号<>,并放入信息;如:
str::vector<int> intVec;
Notation
- 在C++中引入cbegin()和cend()函数,无论容器是否为const,均返回const_iterator;
- 在使用容器迭代器的时候不要改变容器的长度,否则会使迭代器失效;
- 字符数组的特殊初始化方式:
char arr1[] = "learn C++"; //用字符串初始化字符数组,不难理解,字符串就是字符序列,但是会在arr[]末尾加上‘\0’;
int arr1[10]
int arr[10] = {0}; //全部元素初始化为0
int *ptrs[10]; //含有10个int*的数组
int (*arrPtr)[10] = &arr; //arrPtr指向一个含有10个int的数组,注意括号位置,默认情况下,
int *arrPtr[10] = &arr; //错误写法,默认情况下,类型修饰符从右向左依次绑定
int *arrPtr = arr; //等同于:int (*arrPtr)[10] = &arr;数组名本身为首地址
int *(&arrRef)[10] = ptrs; //arrRef是数组的引用,该数组含有10个指针
vector<int> intVec(10, 0); //对,可变长
string str1(10, '1'); //对,可变长
int arr[10] (0); //错,固定长
- 大多数常见的安全问题都是源于缓冲区溢出错误,当数组或其他类似数据结构的下表越界并试图访问非法内存区域时,就会产生此类错误;
- 迭代器:当且仅当支持一套操作,使能够访问容器的元素或者从某个元素移到另外一个元素;有const_iterator和iterator之分,取决于容器是否为const类型;
-
- 标准库函数begin和end(#include ):
int ia[] = {0,1,2,3,4,5,6,7,8,9};
int* beg = begin(ia); //指向ia的首元素位置的指针,即 0
int* last = end(ia); //指向ia的尾元素下一位置的指针
int* mid = beg + 5; //指向ia的中间位置的指针,5
int val = mid[-2]; //取出mid指向位置的前两个位置的元素,即3
//此处与迭代器iterator(不支持负号)不同,