如何优(装)雅(B)地使用C++
介绍一些冷门的C++语法特性,供压行选手使用(雾) 前置知识 C++基础语法( 运算符重载 template 的初级应用(什么是初级呢,会用 template 写 max 就好) functor (只会提及,了解即可) 正文 1.匿名函数(lambda表达式) 需要C++11 比赛可用:★★★☆☆ 代码简化:★★★★☆ 匿名函数应用于需要使用短函数的场合,或者函数需要修改此作用域内(非全局作用域)的局部变量的场合。 常见用法是使用 sort 的时候,需要传入一个 cmp 数组,但是自行定义又太过于繁琐,这时候可以直接使用 lambda 表达式。 基础格式: [捕捉局部变量列表](参数){函数体} 例如,如果需要给 point 排序,以 x 为第一关键字从大到小排序,可以这么写: sort(pi+ 1 ,pi+ 1 +n,[](point a,point b){ if (a.x != b.x) return a.x<b.x; return a.y<b.y; }); lambda 本质是一种 functor ,即重载了 operator () 的类。 笔者曾经想使用 lambda 表达式作为返回值,然后就不想了 笔者曾经想使用 lambda 表达式来玩一些骚操作,然后被类型系统劝退了 2.语句内嵌表达式 无特殊要求 比赛可用:★★★★★ 代码简化:★★☆☆☆ 语句内嵌表达式应用于需要在传入一个值的场合运行一个表达式的情况。这么说可能有点抽象,具体来说,比如我们要执行以下程序段: int a = query( 1 , 1 ,n,l1,r1); int b = query( 1 , 1 ,n,l2,r2); printf ( "%d" ,a+b+a*b); 这时候,就可以使用这样的语法来代替: printf ( "%d" ,({ const int a = query( 1 , 1 ,n,l1,r1); const int b = query( 1 , 1 ,n,l2,r2); a+b+a*b; })); 也就是说,语句内嵌表达式的格式是这样子: (...