• LeetCode刷题基础(使用C++)


    随笔 - 0  文章 - 0  评论 - 0

    C++初学之LeetCode刷题基础

    2019/5/13 

      个人说明:这是我第一次写博客文章,主要是试写,写的不好请谅解。

    初学C++

    下面是关于函数部分的学习
    1. 内联函数
    2. 默认参数列表
    3. 缺省参数列表
    4. 哑元函数
    1. 内联函数

     函数前面加上inline 关键字

     1.内联函数调用原理

    编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到另一个地址(函数的地址),并在函数结束时返回。下面更详细地介绍这一过程的典型实现。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似)。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销

    复制代码
    1 写法如下:
    2  
    3 inline int plus(int a,int b)
    4 {
    5     
    6       return a+b;
    7 
    8 }
    复制代码

    下面这个宏定义和内联函数的区别是看别人写的博客的:

    1.内联函数与宏定义的区别
    C语言使用预处理器语句#define来提供宏。如下例所示:
    #define SQUARE(X) X*X
    宏定义时通过文本替换开实现的--X是参数的符号标记。
    a = square(5.0);->a=5.0*5.0;
    b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
    d = square(c++);->d=c++*c++
    可以看出,对于b,需要使用括号才能正常运算。
    #define SQUARE(X) ((X)*(X))
    对于c,却仍递增了两次。
    因此,宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常。

    什么时候使用内联函数呢?

    说简单点,就是那种操作数量非常少的,而又封装成为函数的函数前使用。我把它理解为杀鸡焉用牛刀。就是说我函数内部的操作本来就是非常快的,而我调用函数这个步骤会耗费一点时间,比如说,我写了100个函数,或者10000个函数,在这之中要寻找和调用就会耗费一点点时间,为了最求速度,使用inline

    如果执行函数代码的时间比处理函数调用机制的时间长,则节省的时间占比很小。若代码执行时间很短,则内联函数就可以节省函数调用的时间。

    2.默认参数列表:

    1 int info(int a=10,int b=20,int c=30)
    2 {
    3     return a+b+c;
    4 }

    对于一个函数,如果我调用的时候没有创参,就传入默认参数列表里的参数

    注意:这里的参数是从左到右进行匹配,并且每一个参数都要赋值,如果缺省,情况在下面我会写到。

    更多代码示例:

    复制代码
     1 void foo(char a='b',int b=2,const char* c="xY")
     2 {
     3      std::cout<<a<<","<<b<<","<< c<<endl;
     4 }
     5 
     6 /*
     7 
     8   注意这里的参数必须写满
     9 
    10 */
    复制代码

    3.缺省参数列表

    为函数指定默认值,参数从左往右匹配,因此,缺省参数必须从有开始设置

    示例代码:

    复制代码
     1 void bar(char a,int b,const char*c="XY")
     2 {
     3     cout<<a<<","<<b<<","<<c<<endl;
     4 }
     5 
     6 /*
     7 
     8    你的参数如果缺省,从前面开始缺,后面的默认参数要连在一起
     9 
    10 
    11 */
    复制代码

    下面是会报错的代码

    复制代码
    void bar(char a='b',int b,const char*c)
    {
        cout<<a<<","<<b<<","<<c<<endl;
    }
    
    /*
       记忆与理解:
      由于参数是从左边到右边进行匹配的。看下面,调用bar(3,"4"),这样 3就赋值给 字符a,
    
     中间的b,和 c怎么分配?
     因此,规定,默认参数从右边往左边写
    
    
    
    */
    
    int main(void)
    {
    
        bar(3,"4");
    
    }
    复制代码

    4.哑元函数

    示例代码如下:

    复制代码
    void func(int,int b,int)
    {
         cout<<b<<endl;
    
    }
    
    int main(void)
    {
         func(1,2,3);
    
    //传参一个都不能少,必须和参数申明的个数一样
    
    }
    复制代码

    哑元函数的意义:

    为了兼容老版本:

    举例:假如我写了一大堆的func 类似的函数 比如   声明时是  func(int a,int b,int c),  目的是返回 a+b+c

    但是后来我返回了,我只有返回 b,返回值只和b 有关,这样我可以在函数的定义那里改动,改为 func(int b),

    但是这样 我在 main函数里面,凡是调用了  func(a,b,c),的函数,我也要改成 func(b)。

    这样是不是很麻烦? 哑元函数的话就不用在 main 函数里修改了,直接把声明的 法a,c 全都删去,只需修改定义函数的那以块地方就行了。

    本人学生,第一次写博客,可能解释的不够专业,或者说的不到位,欢迎各位指出我的错误。

    分类: C++/算法
  • 相关阅读:
    火山喷发 计蒜客16862 NOIP模拟赛 概率DP
    洛谷 1429 平面最近点对(加强版) 快排 非点分治或kdtree
    鬼脚图 计蒜客17353 NOIP模拟 归并排序逆序对
    小X的佛光 NOIP模拟赛 倍增LCA 树结构
    小X的质数 NOIP模拟赛 魔改线性筛素数
    Win7Office2010Flash控件无法使用"此演示文稿中一些控件无法激活,可能这些控件未在此计算机中注册"
    【NOILinux】VmWare15使用技巧
    【超链接】导航网站
    C++统计博客园写过的代码行数
    合并多个txt文件到一个
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/my-CTT_primary_welcomeToMyBlog-fuck0-wBuldBuild_bsuibiibibaflaling_bling_bling_jeckChan.html
Copyright © 2020-2023  润新知