CS 杂笔

78 阅读8分钟

CS杂笔

  1. 压缩工具只是根据文件保存字符的规律生成一套规则,然后用规则去保存源文件,解压就是用规则还原文件。

  2. 其实减治策略思想非常简单,核心就是将问题的规模不断缩小,然后减到一个可以很简单求解的规模,然后解决子问题,再用子问题的解来推原问题的解。 一般情况下,这些子问题的解和原问题有着相同或相似的解决思路。 这种问题,在实际代码上,可以采用递归,也可以采用迭代。 分治策略很好理解,就是分而治之。 分治策略也是将原问题,拆分为规模更小的问题,然后对每个子问题进行求解,最后合并这些子问题的解得到原问题的解。 这里和减治策略的区别是,减治策略在拆分子问题后,会舍弃一部分子问题,而分治策略不会舍弃,而是对每个子问题都求解。

  3. 伪代码 (Pseudocode)是一种算法描述语言。 使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言 (C, Java, Pascal)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。

  4. 逻辑运算符

    a&b与a&&b的区别:a&b——a与b都计算,a&&b——先计算a如果a为false则不计算b。

    a|b与a||b的区别:a|b——a与b都计算,a||b——先计算a如果a为true则不计算b。

  5. 递归与迭代(recursion & iteration)的区别:

    相同点:

    递归和迭代都是循环的一种。

    不同点:

    1、程序结构不同

    递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环。其中,迭代与普通循环的区别是:迭代时,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。

    2、算法结束方式不同

    递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。

    3、效率不同

    在循环的次数较大的时候,迭代的效率明显高于递归。

  6. 取整符号:

    向上取整, 运算称为 Ceiling,用数学符号 ⌈⌉ (上有起止,开口向下)表示。

    向下取整, 运算称为 Floor,用数学符号 ⌊⌋ (下有起止,开口向上)表示。

  7. 树边、前向边、后向边、跨边(横叉边)(cross edge):

    image.png

  8. 虚函数:

    简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。

  9. 腾讯会议支持在共享屏幕的过程中对共享者的计算机进行远程控制。

  10. dll:动态链接库(dynamic link library)

    主要优势:可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。

  11. emplace_back()是C++ 11新增加的,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。

             push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中;
             
             emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
             
             换句话说,emplace_back() 的执行效率比 push_back() 高,因此,在实际使用时,建议优先选用emplace_back()。
    
  12. break:用break语句可以使流程跳出switch语句体,也可以用break语句在循环结构终止本层循环体,从而提前结束本层循环。

            使用说明:
            
            (1)只能在循环体内和switch语句体内使用break;
            
            (2)当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。
            
            continuecontinue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。
            
            注意:continue语句并没有使整个循环终止。
    
  13. 构建大顶堆的方法

           ```c++
           priority_queue<int, vector<int>, less<int>> big_heap; 
           ```
           
           构建小顶堆的方法
           
           ```c++
           priority_queue<int, vector<int>, greater<int>> small_heap;
           ```
    
  14. 位运算符:

          左移:<<
          
          右移:>>
    
  15. PIN number (Personal Identification Number):识别号码,个人密码。

  16. 以_t为后缀的数据类型:元数据类型。为了与程序员定义的新数据类型加以区分,操作系统定义的数据类型会添加后缀 _t。

  17. 什么是函数指针:如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

       那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如:
       
       ```c
       int(*p)(int, int);
       ```
       
       这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“ * ”,即( * p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(intint)。
       
       所以函数指针的定义方式为:
       
       ```
       函数返回值类型 (* 指针变量名) (函数参数列表);
       ```
       
       “函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。
    
  18. argc 是argument(参数) count的缩写表示传入main函数中的参数个数,包括这个程序本身;

      argv 是 argument vector的缩写表示传入main函数中的参数列表,其中argv[0]表示这个程序的名字。
    
  19. 作为一名初学者,一直困惑于回调函数在类中为何要加static。在深入浅出MFC中找到答案,留下笔记。

     如果一个callback函数是一个类成员函数,就要加上static,原因在于必须舍弃掉类成员函数的隐藏参数this指针 。
     ​
     比如一个callback函数被要求声明为以下形式:
     ​
     ```cpp
     void CALLBACK function();
     ```
     ​
     如果这个函数在类ObjClass里面,[编译器](https://so.csdn.net/so/search?q=编译器&spm=1001.2101.3001.7020)会为其添加一个this指针,用于指向调用该函数的对象。所以编译出来的代码是这种形式:
     ​
     ```cpp
     void CALLBACK ObjClass::function(ObjClass* this);
     ```
     ​
     显然有个this指针,函数参数列表与被要求声明的形式不一致。
     但是加上static,就表示该类成员函数属于类所有,舍弃掉this指针。
    
  20. ::是作用域运算符,A::B表示作用域A中的-名称B,A可以是名字空间、类、结构。

  21. C文件变成最终的可执行文件,需要经过四步:

    • 预处理
    • 编译
    • 汇编
    • 链接
    步骤Linux命令作用
    预处理gcc -E test.c -o test.i处理所有以井号键开头的代码,包括头文件、宏定义、条件编译等等。(头文件展开,宏定义替换,条件编译)
    编译gcc -S test.i -o test.s1.语法检查。 2.把C代码翻译成汇编代码。
    汇编gcc -c test.s -o test.o把汇编代码翻译成二进制代码
    链接gcc test.o -o test1.把所有需要的源文件合并到一起 2.链接代码中需要用到的库(比如printf,需要链接到C库)。

    经过四个步骤,得到的文件才是最终可执行的,只不过Linux下的可执行文件没有后缀,Windows下可执行文件的后缀是exe。

    PS:简单来说:宏定义又称为宏代换、宏替换,简称“宏”。是C提供的三种预处理功能的其中一种。

  22. 类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。

    析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源

  23. UML:统一建模语言(Unified Modeling Language)

  24. token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情