前段时间在LeetCode上刷题, 看见耗时很短的几个示例, 都在开头添加了一个东西:
static auto x = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();
去网上查了查, 已经有很多人说过这个东西. 就是第一条解除了C++io和stdio的同步, 极大地提升了cin的速度, 第二条省略了cout << 之后再调用cin >> 会刷新缓冲区的步骤; 但是很少有人提到这里的语法究竟怎么一回事.
后来看到C++PrimerPlus上有专门关于C++11新标准的讨论, 里面介绍了 Lambda表达式, 也称匿名函数, 才最终全部搞明白.
首先, 匿名函数形如:
[](){/*put your code here*/}
[] 位于正常函数应该放函数名的地方
里面可以放上要访问的数据, 不过这不在这篇文章的讨论范围之内
() 放参数列表
跟正常函数一样就行
{} 放你的代码
同上
如果一个函数需要传递函数指针( 如qsort() ), 但是这个函数指针指向的函数很简单, 你并不想跑到正在敲代码的这个函数的外面去另写一个, 就可以就地写一个匿名函数,或者直接在应该放函数指针的地方放上一个匿名函数就行.
所以, 以我个人的理解, 这个匿名函数的定义式实际上就是这个匿名函数所代表的函数的名称, 它本身就可以当做一个函数名来用
然后, 回到原来的那条语句
static auto x = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();
这里实际上就是这个:
static auto x = function();
其中的function就相当于:
[](){/*blabla*/}
所以, 最后面那个括号, 意思是, 把前面的匿名函数定义 当成函数名, 然后调用一下这个函数
整个语句的意思是调用一下这个函数, 返回0, 赋值给x
因为在所有函数(包括main)都执行之前 就要运行一下那个优化函数, 所以这里用到了一个技巧, 用函数来初始化一个全局变量, 而那个函数正是一个包含优化语句的匿名函数
auto是C++11新指定的标准: 自动类型初始化, 简化书写, 以后妈妈再也不用担心我用STL迭代器要写一大堆了: for (auto i = nums.begin(); i != nums.end(); i++)