前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | foreach 循环算法 | Lambda 表达式 - 匿名 函数对象 / 仿函数 )

【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | foreach 循环算法 | Lambda 表达式 - 匿名 函数对象 / 仿函数 )

作者头像
韩曙亮
发布2024-01-06 09:49:02
1220
发布2024-01-06 09:49:02
举报
文章目录
  • 一、foreach 循环中传入 函数对象 / Lambda 表达式处理元素
    • 1、foreach 循环算法
    • 2、foreach 循环中传入 函数对象 处理元素
    • 3、foreach 循环中传入 Lambda 表达式 处理元素
    • 4、Lambda 表达式 - 匿名 函数对象 / 仿函数

一、foreach 循环中传入 函数对象 / Lambda 表达式处理元素


1、foreach 循环算法

在 C++ 语言中 , std::foreach 循环 虽然 不是标准库的一部分 , 但是 C ++ 编译器 提供了对 该语法 的支持作为扩展 ;

使用 该 std::foreach 循环 , 可以用于 遍历 STL 标准模板库 中提供的容器 , 如 vector 单端数组 , list 双向链表 , map 映射 , set 集合 等 容器 中的元素 ;

std::for_each 是一个算法 , 该算法 接受一对迭代器 , 表示 容器 的 起始位置 和 结束位置 和 一个可调用对象 , 如 : 函数 / 函数指针 / 仿函数 / 函数对象 / Lambda 表达式 , 并对范围内的每个元素调用该可调用对象 ;

注意 : 上述 迭代器 范围 是一个 前闭后开 区间 ;

2、foreach 循环中传入 函数对象 处理元素

使用 foreach 循环遍历 STL 容器 中的元素时 , 可以对 被遍历的 元素 使用 函数对象 / 仿函数 , 这三个是同一个概念 , 相当于 在循环体中调用该 函数对象 / 仿函数 中的 " 重载 函数调用操作符 () 函数 " ;

在下面的代码中 , 自定义了 PrintT 仿函数类 , 该类对象可以 直接当做函数一样调用 ;

代码语言:javascript
复制
//函数对象 类重载了()
template <typename T>
class PrintT{
public:
	void operator()(T& t){
		cout << t << endl;
	}
};

向 foreach 循环中 , 直接传入该 仿函数类 对象 ( 又称为 " 函数对象 " ) ,

代码语言:javascript
复制
for_each(vec.begin(), vec.end(), PrintT<int>());

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"

//函数对象 类重载了()
template <typename T>
class PrintT{
public:
	void operator()(T& t){
		cout << t << endl;
	}
};

int main() {

	// 创建一个 vector 单端数组容器
	vector<int> vec;

	// 向容器中插入元素
	vec.push_back(1);
	vec.push_back(3);
	vec.push_back(5);

	// 向 foreach 循环中传入函数对象
	// 在函数对象中打印元素内容
	for_each(vec.begin(), vec.end(), PrintT<int>());


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

1 3 5 Press any key to continue . . .

在这里插入图片描述
在这里插入图片描述

3、foreach 循环中传入 Lambda 表达式 处理元素

在下面的 foreach 循环中 , 传入了 Lambda 表达式 , 该 Lambda 表达式实现的效果

代码语言:javascript
复制
[](int num) {
	std::cout << num << endl;
}

与 函数对象 / 仿函数 实现效果相同 ;

代码语言:javascript
复制
//函数对象 类重载了()
template <typename T>
class PrintT{
public:
	void operator()(T& t){
		cout << t << endl;
	}
};

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"

int main() {

	// 创建一个 vector 单端数组容器
	vector<int> vec;

	// 向容器中插入元素
	vec.push_back(1);
	vec.push_back(3);
	vec.push_back(5);

	// 向 foreach 循环中传入 Lambda 表达式
	// 在函数对象中打印元素内容
	for_each(vec.begin(), vec.end(), [](int num) {
		std::cout << num << endl;
	});


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

1 3 5 Press any key to continue . . .

在这里插入图片描述
在这里插入图片描述

4、Lambda 表达式 - 匿名 函数对象 / 仿函数

在上面的代码中 , 使用了 Lambda 表达式 , 如下所示 :

代码语言:javascript
复制
	// 向 foreach 循环中传入 Lambda 表达式
	// 在函数对象中打印元素内容
	for_each(vec.begin(), vec.end(), [](int num) {
		std::cout << num << endl;
	});

Lambda 表达式 是一个 匿名的 函数对象 / 仿函数 ;

Lambda 表达式 语法如下 :

代码语言:javascript
复制
[capture](parameters) -> return_type { body_of_lambda }
  • capture 捕获列表 : 指定哪些外部变量可以在 lambda 函数体内被访问到 ;
  • parameters 参数列表 : 和普通函数的参数列表类似 ;
  • return_type 返回类型 : 可省略 , 如果在 函数体中返回某个值 , 编译器会自动推导返回类型 ;
  • body_of_lambda 函数体 : 实现特定功能 ;

capture 捕获列表 语法 :

  • [x] : 通过 值捕获 x ;
  • [&y] : 通过 引用捕获 y ;
  • [=] : 通过值 捕获所有外部变量 ;
  • [&] : 通过引用 捕获所有外部变量 ;
  • [this] : 捕获当前类的 this 指针 ;

上述 foreach 循环中 , 没有捕获外部的变量 , 传入了 int 类型的参数 , 在函数体内打印了 int 类型参数 ; 这个 int 类型的参数就是 STL 容器中的值 ;

代码语言:javascript
复制
[](int num) {
	std::cout << num << endl;
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、foreach 循环中传入 函数对象 / Lambda 表达式处理元素
    • 1、foreach 循环算法
      • 2、foreach 循环中传入 函数对象 处理元素
        • 3、foreach 循环中传入 Lambda 表达式 处理元素
          • 4、Lambda 表达式 - 匿名 函数对象 / 仿函数
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com