C++中易混的点

一、前言

整理了几个我的易错点,大家共勉~

二、易错点

  • definetypedef的区别
    特性 define typedef
    本质 无脑替换(不管语法) 定义类型别名(遵循C++语法)
    处理阶段 编译之前(预处理) 编译时期
    例子 define PI 3.1415926 typedef int element
  • 复合逻辑表达式的结果是TrueFalse,不是01
    // 复合逻辑表达式
    a % b == 0 && c * c > a + b * b
    
  • 关于sizeofsizestrlenlength

    sizeof:求数据类型和表达式结果所占用的内存大小

    const char *message = "C++ Programming!";
    int a = sizeof(message);			// 8
    									// message是指针,这里本质是求指针的内存大小
    

    size:返回字符串/容器的长度,不包括\0

    const char *message = "C++ Programming!";
    int a = message.size();				// 16
    

    strlen:返回字符串的有效,也不包括\0

    const char *message = "C++ Programming!";
    int a = strlen(message);			// 16
    

    length:和size几乎是等价的

    唯一一点是:size适合STL的所有容器;length主要是std::string

  • 关于二叉树的一个性质(难记)

    注意:一定是二叉树的性质昂~

    先展示结果:``度为0的节点数 = 度为2的节点数 + 1`

    阐释

    注:下标表示度,n表示节点个数。

    • n = n0 + n1 + n2

      这个很好理解了,总节点数就是度为0的节点数+度为1的节点数+度为2的节点数

    • n = n1 + 2 * n2 + 1

      首先,1根线连着1个节点(像1个棒棒糖)。
      度为1的节点可以引出1个棒棒糖
      度为2的节点可以引出2个棒棒糖
      再加上1个根节点(只有它是无根之“花”)
      这些都加起来就是总节点数
      // 简单约分一下,就得到性质本质啦~

  • 关于*p

    *p从我接触时开始,理解上总是不深刻,这次应该可以了

    #include <iostream>
    using namespace std;
    
    int main() {
        int a = 5;
        int* p = &a;		// *p中*表示指针声明符,目的是声明p是指向变量a的指针
        *p += 5;			// *p中*表示解引用运算符,目的是获取p所指向的内存地址中的值							// 可以对其进行修改,并且是有效修改
        cout << a << endl;
        return 0;
    }
    
  • 大根堆

    大根堆和小根堆的本质区别在于:大和小。这里以大根堆为例进行讲解。

    大根堆阐释

    • 大:元素的大小(以大为主)
    • 根:根节点就是最大值
    • 堆:这里的堆表示一种特殊的完全二叉树,特殊之处在于:满足特定的排序性质

    如图

    		 30
    		/  \
    	   20   15
    	  / \   / \
    	 10  8 12 
    // 数组存储:[30, 20, 15, 10, 8, 12]		层次遍历
    

    当对该树进行插入/删除操作时,永远要遵循一个约定根节点就是最大值

    以插入为例,步骤

    • 待插入元素放在末尾
    • 为了满足性质,对树的结构不断进行改变:上浮。将待插入元素和根节点不断进行比较,如果比根节点大的话,就和根节点交换位置,就像是不断上浮
    • 直到比根节点小,结束

    最终结果

    // 向堆中插入25
    		 30
    		/  \
    	   20   15
    	  / \   / \
    	 10  8 12 25 
    
    // 15和25比较,15 < 25,交换
    		 30
    		/  \
    	   20   25
    	  / \   / \
    	 10  8 12 15
    // 得到最终结果:[30, 20, 25, 10, 8, 12, 15]
    

三、小结

阶段性写一写,最近事情比较多,浅浅整理一下~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐