C++ 语法知识补充

目录

    • C++ 语法知识补充:
      • 优先级
      • new 和 delete
      • 树的遍历

C++ 语法知识补充:

  • erase()函数

    erase函数的原型如下:

    (1)string& erase(size_t pos = 0, size_t n = npos);

    (2)interator erase(iterator position);

    (3)iterator erase(iterator first, iterator last);

    有三种用法:

    (1)erase(pos, n); 删除从pos开始的n个字符,例如erase( 0, 1),删除0位置的一个字符,即删除第一个字符。

    (2)erase(position); 删除position处的一个字符(position是个string类型的迭代器)。

    (3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)。

    int main ()
    {
      string str ("This is an example phrase.");
      string::iterator it;
     
      // 第(1)种用法
      str.erase (10,8);
      cout << str << endl;        // "This is an phrase."
     
      // 第(2)种用法
      it=str.begin()+9;
      str.erase (it);
      cout << str << endl;        // "This is a phrase."
     
      // 第(3)种用法
      str.erase (str.begin()+5, str.end()-7);
      cout << str << endl;        // "This phrase."
      return 0;
    }
    
  • reverse函数用于反转在==[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素)==

  • push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。

  • emplace_back() 在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员。

  • stoi() 把数字字符串转换成int输出,参数是const string*,不需要转化为 const char*

  • atoi() 把数字字符串转换成int输出,参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char*类型的

  • sub_string(string str, int a) 第a个字符开始截取后面所有的字符串

  • resize(n) 设置大小(size)

    • 调整容器的长度大小,使其能容纳n个元素。
    • 如果n小于容器的当前的size,则删除多出来的元素。
    • 否则,添加采用值初始化的元素。
    • 容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。
  • resize(n, t) 多一个参数t,将所有新添加的元素初始化为t

  • reserve() 设置容量(capacity)预分配n个元素的存储空间。

    • reserve()函数预分配出的空间没有被初始化,所以不可访问。
  • auto C++11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。

    • 用auto声明的变量必须初始化(auto是根据后面的值来推测这个变量的类型,如果后面没有值,自然会报错)

    • 函数和模板参数不能被声明为auto(原因同上)

    • 因为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid。

    • 定义在一个auto序列的变量必须始终推导成同一类型

      • auto x1 = 5, x2 = 5.0, x3='r'; *// This is too much....we cannot combine like this*
    • 示例:

      • std::vector<std::string> ve;
        std::vector<std::string>::iterator it = ve.begin();
        //用atuo来代替那个初始化类型
        auto it = ve.begin();
        
  • int 数据范围

    C中int类型是32位的,范围是-21474836482147483647 
    #define INT_MAX 2147483647
    #define INT_MIN (-INT_MAX - 1)
    

    优先级

C++ 语法知识补充_第1张图片

new 和 delete

  1. new

    • new和delete运算符是用于动态分配和撤销内存的运算符,必须成对适用;

    • new用法——开辟单变量地址空间、开辟数组空间;

    • new作用—— 使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值;

    • new出来的对象用对应数据类型的指针接收——**new运算符返回的是一个指向所分配类型变量(对象)的指针。**对所创建的变量或对象,都是通过该指针来间接操作的;

    • new一般使用格式(3种)(开辟单变量地址空间)

      1. 指针类型* 指针变量名 = new 数据类型;
        • int *a = new int 将一个int类型的地址赋值给整型指针a
      2. 指针类型* 指针变量名 = new 数据类型(初值);
        • int *a = new int(2) 作用同上, 但是同时将整数空间赋值为2
      3. 指针类型* 指针变量名 = new 数据类型(内存单元个数);
    • 开辟数组空间

      • 指针类型* 指针变量名 = new 数组类型[数组元素个数];
      • 一维: int *a = new int[100]; //开辟一个大小为100的整型数组空间
      • 二维: int **a = new int[5][6];
  2. delete

    • delete [] 的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。

    • delete用法

      1. 删除单变量地址空间
        • int *a = new int[2];
        • delete a; //释放单个int的空间
      2. 删除数组空间
        • int *a = new int[5];
        • delete []a; //释放int数组空间

树的遍历

DLR–前序遍历–根左右(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )

LDR–中序遍历–左根右(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

LRD–后序遍历–左右根(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)

  • 前序遍历(根 左 右)

C++ 语法知识补充_第2张图片

  • 中序遍历(左 根 右)

C++ 语法知识补充_第3张图片

// 打印中序遍历
void dfs(Node* root) {
    if(root == nullptr) return;
    dfs(root->left); // 左
    cout << root->val << endl; // 根
    dfs(root->right); // 右
}
  • 后序遍历(左 右 根)

    C++ 语法知识补充_第4张图片

你可能感兴趣的:(C语言笔记,c++,开发语言,笔记)