c++ 小结之lambda函数

判断一个字符串是否仅由数字字符组成

在c++中判断一个字符串是否仅有数字字符组成并非难事,可以使用all_of( )函数,它在头文件<algorithm>中。函数原型如下:

template <class InputIterator, class Predicate>
bool all_of( InputIterator first, InputIterator last, Predicate pred );

参数解释如下:

first:起始位置,迭代器实现

last:结束位置,迭代器实现

pred:谓词,即一个返回bool的函数或函数对象

对于谓词在计算机术语中可能有些陌生,但是在数学中有这个明确的概念——谓词是指主体所能执行的性质或能力。简言之,这个主体的行为是什么。谓词通常是函数或可调用对象,常见的有函数指针、lambda表达式、函数对象。这里着重介绍一下lambda表达式。


lambda表达式

lambda表达式的形式如下:

[ capture_list ]( parameter_list ) -> return_type { /* 函数体 */ }

lambda表达式的名称和定义来源于数学中的\(\lambda\)演算——一种定义和应用函数的数学系统。所以lambda允许作为匿名函数使用,因为在c++中匿名通常意味着一次性的,如果没有给匿名函数一个命名通常很难二次使用(一种方法是你在堆上定义,即动态分配空间,事实上你命名了,只不过被赋予给了其它变量),而\(\lambda\)演算是定义与应用并存的系统,这意味着是可以匿名的。

如果函数体仅有一条返回语句,则可以省略返回类型后置语法,其形式如下:

[ capture_list ]( parameter_list ) { /* 仅一条返回语句的函数体 */ }

[ capture_list ]指lambda被创建时可以捕获的变量,捕获变量有以下四种方式:

[ = ]:按值捕获所有可见变量

[ & ]:按引用捕获所有可见变量

[ variable_list ]:按值捕获指定的可见变量

[ &variable_list ]:按引用捕获指定的可见变量

[ =, &variable ]:按值捕获所有可见变量,除了指定变量按引用捕获,这是混合类型,你也可以[ &, variable ],逻辑一致

捕获到的变量可以在lambda表达式的函数体中使用,其变量名与捕获的变量名同名,如果按值捕获则是副本。在c++中,lambda表达式本质上是匿名函数对象,通常lambda是在栈中创建。当然,你也可以在堆中创建。所以可见变量是自动变量,lambda不能捕获动态变量。如果lambda要改变动态变量需要通过指针或引用来间接实现,因为指针或引用是自动变量。因为lambda是在栈中创建,所以它有生命周期,这区别于函数。因此,捕获到的变量在lambda中使用时要注意其生命周期与lambda本身是否冲突。此外,可见变量是指lambda被创建时的自动变量,如果某个自动变量在lambda后,则对lambda不可见。

( parameter_list )部分与函数参数类似,可以是值也可以是引用。lambda是匿名函数,通常是作为一次性使用,但是如果要多次使用是否可行呢?可以,但是只能在当前栈空间中,因为前面说过lambda有生命周期。多次使用的方法是给lambda表达式一个别名:

auto other_name = [ capture_list ]( parameter_list ) -> return_type { /* 函数体 */ };
// 使用lambda时,可以直接使用或传递other_name
// 可多次使用,只有在当前栈空间,即当前作用域

别名的类型取决于编译器采用什么类型来追踪lambda。这使得函数就像变量一样,根据需要创建,又根据需要被销毁。因为lambda是匿名函数,所以lambda是函数,之所以强调这一点是因为lambda具有函数时的一些特点,尤其在调用时。lambda分为创建和调用,创建注意生命周期与捕获,而调用需要注意它作为函数的一些语法。

// 承接上述
// 直接使用
other_name( argument_list );
// 传递使用
other_function( ..., other_name );

直接使用时我们需要加上( ),表明这是函数,若需要则传递参数。即使是在创建时就调用也要加上( )

[ capture_list ]( parameter_list ) -> return_type { 
    /* 函数体 */
}( argument_list );

实现

判断一个字符串是否仅由数字字符组成的一个简单方法如下:

all_of( first, last, []( char ch ){ return isdigit( ch ) || ch == '\0' } );

firstlast表示字符串的起点与终点。all_of( )会遍历内容,对于每一个元素都会传递给第三个参数,这里的参数传递是隐式的。

posted @ 2025-06-24 01:24  永恒圣剑  阅读(30)  评论(0)    收藏  举报