可变参数与foreach 的原理

Posted bobhuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可变参数与foreach 的原理相关的知识,希望对你有一定的参考价值。

曾经写过c++11特性使用,但是这个究竟是什么呢,和其他语言的foreach语句十分相像

函数必须具有在编译时已知的单个返回类型;当编译器可以从上下文中找出它必须是什么时,auto只会使您不必输入它。所以你给一个模版类,如果编译的时候没有其类型,一定是无法通过的,我们使用map其实是在调用这个库的代码,当然map本身是无法编译和运行,其必须要KeyValue类型参数。

当然C++14的auto和11的不一样,在那篇文章仅是介绍了auto的使用,我们是无法看出之间的区别的,我们实现一个函数把vector所有元素*3并返回

//C++98
std::vector<int> &multiply_by_three(std::vector<int> &v)

    for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
    
        *it *= 3;
    
    return v;

初学者还很容易忘记iterator怎么拼,有时候也会写错

//C++11
std::vector<int> &multiply_by_three(std::vector<int> &v)

    //这里&表示引用,而不是求地址运算符,是可以直接操作的,用来加快速度
    //(指针和引用都不会创建新的对象。构造对象和析构对象的开销可能是庞大的)
    for (auto &it : v)
    
        it *= 3;
    
    return v;

更快,更好写

auto& multiply_by_three(std::vector<int>& v) 

      for(auto& it : v) 
      
          it *= 3;
      
      return v;

支持返回值的类型判断,我们有时候也会写匿名函数,比如sort这样的

 sort(S.begin(),S.end(),[]
    (const string &s,const string &c)
    
      return s>c;
    
    );

其实这都属于语法糖Lambda

下面是各种变量截取的选项:
  • [] 不截取任何变量
  • [& 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar]   截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [this]            截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了。这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能、或能提升语法的严谨性、或能减少编码出错的机会。

我们可以看他的遍历的汇编代码有什么不同

用的是-S命令,比如gcc -g -S B.cpp

我没对比出什么啊,有些指令不一样,但是我也不是看得太懂

以上是关于可变参数与foreach 的原理的主要内容,如果未能解决你的问题,请参考以下文章

函数栈帧与可变参数列表 p1可变参数列表(完结)( C语言从入门到入土(进阶篇)

es6可变参数-扩展运算符

C语言奇淫技巧之函数的可变参数

可变参数使用

PHP 可变参数

C#方法:个数可变的参数 params -0027