C++基础学习-3

140 阅读3分钟

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(不支持负号)不同,