十四、C++速通秘籍—函数式编程
目录
上一章节:
一、引言
一、函数式编程基础
三、Lambda 表达式
作用:
Lambda 表达式捕获值的方式:
注意:
四、函数对象
函数对象与普通函数对比:
五、函数适配器
1、适配普通函数
2、适配 Lambda 表达式
3、适配函数对象(仿函数)
使用场景
六、bind函数适配器
七、函数式编程的应用
八、总结
下一章节:
上一章节:
十三、C++速通秘籍—PIMPL编程原则-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147190679?spm=1001.2014.3001.5502
一、引言
一、函数式编程基础
- 不可变性:在函数式编程里,数据一旦创建就不可改变。比如在传统 C++ 中,我们可能会这样写代码:
int a = 5;
a = 10; // 修改变量a的值
int add(int num) { return num + 5;
}int result = add(5); // result为10,没有修改传入的参数
- 高阶函数:是指接受函数作为参数,或者返回一个函数的函数。C++ 中的std::for_each 就是一个高阶函数的例子:
#include <iostream>
#include <algorithm>
#include <vector>void print(int num)
{ std::cout << num << " ";
}int main()
{ std::vector<int> vec = {1, 2, 3, 4, 5};std::for_each(vec.begin(), vec.end(), print);return 0;
}
- 闭包:闭包是一个函数对象,它可以捕获其创建环境中的变量。在 C++ 中,Lambda 表达式就常用来创建闭包。例如:
#include <iostream>
#include <vector>int main()
{ int factor = 2;auto multiply = [factor](int num) {return num * factor; }; std::vector<int> vec = {1, 2, 3}; for (int num : vec) { std::cout << multiply(num) << " "; } return 0;
}
- 惰性求值:惰性求值是指表达式只有在真正需要结果时才进行计算。在 C++ 中,虽然没有像某些函数式编程语言那样原生支持惰性求值,但我们可以通过一些技巧来模拟。比如自定义一个延迟计算的类模板。
三、Lambda 表达式
#include <iostream>
#include <algorithm>
#include <vector>int main()
{ std::vector<int> vec = {5, 3, 1, 4, 2}; std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; }); for (int num : vec) { std::cout << num << " "; } return 0;
}
作用:
- 简化程序结构,因为优化了函数命名与函数传参;
- 提高程序运行效率,因为优化了函数调用、函数返回等消耗;
- 适用于简单功能的函数优化;
Lambda 表达式捕获值的方式:
捕获方式 | 说明 |
---|---|
= | 按值捕获,lambda内部可以使用,但是无法更改值 |
& | 按地址捕获,lambda内部可以使用,同时也更改了实际值 |
变量名 | 按值捕获,可用不可改 |
&变量名 | 引用捕获,可用可改 |
副本捕获 | c++14后可以自定义变量名 = 捕获变量,但是无法通过副本名改变变量名 |
#include <iostream>int main(int argc, char **argv)
{int num1 = 5;int num2 = 6;auto func_add = [&num1,num2]() //num1可修改,num2不可修改{num1 = 7;return num1 + num2;};auto func_add1 = [=](int a, int b){a = 1; //这里修改的只是形参a/b的值,不会改变num1与num2的值b = 1;return a + b;};auto func_add2 = [&]{// num1 = 1; //按引用传递,可用可修改num1与num2的值return num1 + num2;};std::cout<<func_add()<<std::endl;std::cout<<"num1 = "<<num1<<" num2 = "<<num2<<std::endl;std::cout<<func_add1(num1,num2)<<endl;std::cout<<"num1 = "<<num1<<" num2 = "<<num2<<std::endl;std::cout<<func_add2()<<endl;std::cout<<"num1 = "<<num1<<" num2 = "<<num2<<std::endl;return 0;
}
注意:
四、函数对象
- 函数对象的定义和使用:函数对象是一个类或结构体,它重载了函数调用运算符"()"。例如:
#include <iostream>
#include <string>
#include <functional>using namespace std;template <typename T>
class Add
{
public:Add() = default;void operator()(T &&a, T &&b) //重载函数运算符,采用的是万能引用{cout<<a+b<<endl;}
};int main(int argc ,char **argv)
{Add<int> c_add;c_add.operator()(5,6); //利用成员函数的形式调用c_add(5,6); //采用函数成员方式plus<int> p1;cout<<p1(5,6)<<endl; //使用系统函数对象库return 0;
}
- STL 中的函数对象:C++ STL 中提供了很多预定义的函数对象,如std::plus、std::less 等。例如使用std::plus 来对两个数求和:
#include <iostream>
#include <functional>int main()
{ std::plus<int> plus_op; int result = plus_op(5, 3); std::cout << result << std::endl; return 0;
}
#include <iostream>
#include <numeric>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5}; int sum = std::accumulate(vec.begin(), vec.end(), 0); std::cout << sum << std::endl; return 0;
}
函数对象与普通函数对比:
- 函数对象比一般函数更灵活,因为它可以拥有状态(state),事实上,对于相同的函数对象可以设置两个状态不同的实例;普通函数没有状态;
- 每个函数对象都有其类型,因为你可以将函数对象的类型当做template参数传递,从而指定某种行为;
- 执行速度上,函数对象通常比函数指针更快;
五、函数适配器
1、适配普通函数
#include <iostream>
#include <functional>
int add(int a, int b) {return a + b;
}
int main() {std::function<int(int, int)> func = add; std::cout << func(3, 4) << std::endl; return 0;
}
2、适配 Lambda 表达式
#include <iostream>
#include <functional>
int main() {std::function<int(int, int)> func = [](int a, int b) {return a * b;};std::cout << func(3, 4) << std::endl; return 0;
}
3、适配函数对象(仿函数)
#include <iostream>
#include <functional>
struct Subtract {int operator()(int a, int b) const {return a - b;}
};
int main() {std::function<int(int, int)> func = Subtract();std::cout << func(5, 3) << std::endl; return 0;
}
使用场景
- 泛型编程:模板函数中,可将不同类型可调用对象(函数指针、Lambda、函数对象等)包装后作为参数传递,使模板函数能处理多种调用逻辑,增强代码通用性与灵活性。例如编写通用算法模板,可接收不同比较规则的函数包装器实现自定义排序等操作。
- 回调函数 :在事件驱动编程(如图形界面开发、网络编程 )中,常需设置回调函数。用函数包装器可方便存储和管理这些回调,在特定事件发生时调用。如注册按钮点击事件回调,可将处理逻辑写成普通函数、Lambda 等,再用函数包装器管理并传递给按钮组件。
- 异步编程 :多线程或异步任务场景下,函数包装器可存储要在新线程或异步环境执行的函数。如使用std::thread创建线程时,可将函数包装器作为线程执行任务,方便管理任务逻辑。
- 日志记录与性能监控 :通过包装器,可在函数执行前后添加日志记录代码,记录输入参数、执行时间等信息,辅助调试和性能优化;也能进行性能分析,记录函数执行耗时、资源占用等指标。
- 权限验证与异常处理 :在函数执行前,利用包装器进行权限验证,确保只有有权限用户能调用;执行过程中捕获异常并处理,如打印错误信息、进行重试等操作 ,增强程序稳定性与安全性。
六、bind函数适配器
#include <iostream>
#include <functional>
using namespace std;template <typename T>
class Add
{
public:T operator()(T a, T b, T c){print();return a + b;}void operator()(const T &a){cout << a << endl;}void print(){cout << "function add!" << endl;}int m_result;
};int add(int a, int b, int c)
{cout << "a = " << a << " b = " << b << endl;return a + b + c;
}int main()
{//普通函数function<int(int,int)> my_add = std::bind(add,std::placeholders::_1,std::placeholders::_2,0);cout << my_add(5,6) << endl;function<int()> my_add2 = std::bind(add,7,8,0);cout << my_add2() << endl;//lambda表达式auto lambda_func = [=](int a, int b, int c){return a + b + c;};function<int(int,int)> my_add3 = std::bind(lambda_func,std::placeholders::_2,std::placeholders::_1,0);cout << my_add3(3,4) << endl;function<int()> my_add4 = std::bind(lambda_func,3,4,0);cout << my_add4() << endl;//函数对象Add<int> c_add;function<int(int,int)> my_add5 = std::bind(c_add,std::placeholders::_2,std::placeholders::_1,0);cout << my_add5(4,5) << endl;function<int()> my_add6 = std::bind(c_add,5,6,0);cout << my_add6() << endl;return 0;
}
七、函数式编程的应用
- 数据处理:在处理大量数据时,函数式编程可以让代码更简洁和易于理解。比如对一个包含学生成绩的数组进行筛选,找出成绩大于 80 分的学生,使用函数式编程风格的代码可能如下:
#include <iostream>
#include <vector>
#include <algorithm>
struct Student { std::string name; int score;
};int main()
{ std::vector<Student> students = {{"Alice", 85}, {"Bob", 70}, {"Charlie", 90}}; std::vector<Student> high_scores; std::copy_if(students.begin(), students.end(), std::back_inserter(high_scores), [](const Student& s) {return s.score > 80; }); for (const auto& student : high_scores) { std::cout << student.name << " : " << student.score << std::endl; } return 0;
}
- 并发编程:函数式编程的不可变性等特性在并发编程中很有优势,因为不可变的数据不用担心多线程访问时的竞争问题。例如,在使用std::async 进行异步任务时,可以传递函数式风格的函数对象。
- 机器学习:在机器学习领域,函数式编程可以用于数据预处理、模型训练过程中的函数组合等场景。比如对数据集进行一系列的变换操作,可以通过组合不同的函数来实现。
八、总结
下一章节:

相关文章:
十四、C++速通秘籍—函数式编程
目录 上一章节: 一、引言 一、函数式编程基础 三、Lambda 表达式 作用: Lambda 表达式捕获值的方式: 注意: 四、函数对象 函数对象与普通函数对比: 五、函数适配器 1、适配普通函数 2、适配 Lambda 表达式 …...
复刻系列-星穹铁道 3.2 版本先行展示页
复刻星穹铁道 3.2 版本先行展示页 0. 视频 手搓~星穹铁道~展示页~~~ 1. 基本信息 作者: 啊是特嗷桃系列: 复刻系列官方的网站: 《崩坏:星穹铁道》3.2版本「走过安眠地的花丛」专题展示页现已上线复刻的网…...
阿里云备案有必要选择备案管家服务吗?自己ICP备案可以吗?
阿里云备案有必要选择备案管家服务吗?新手可以选择备案管家,备案管家不需要自己手动操作,可以高效顺利通过ICP备案。自己ICP备案可以吗?自己备案也可以的,也很简单,适合动手能力强的同学。 阿里云备案管家…...
SQL语言基础(二)--以postersql为例
上次教程我们讲述了数据库中的增,删,改语句,今天我们来学习最后一个–‘改’的语句。 1.select语法 数据库查询只有select一个句子,但select语法相对复杂,其功能丰富,使用方式也很灵活 SELECT [ALL|Dist…...
探索 Rust 语言:高效、安全与并发的完美融合
在当今的编程语言领域,Rust 正以其独特的魅力吸引着越来越多开发者的目光。它诞生于 Mozilla 实验室,旨在解决系统编程中长久以来存在的难题,如今已成为构建可靠、高效软件的有力工具。 1 内存安全 Rust 通过所有权(ownership&a…...
最大公约数和最小倍数 java
在Java中,计算两个数的最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是常见的编程问题。以下是具体的实现方法和代码示例。 --- ### **1. 最大公约数 (GCD)** 最大公约数是指…...
OpenHarmony Camera开发指导(三):相机设备输入输出(ArkTS)
相机应用可通过创建相机输入流调用并控制相机设备,创建不同类型的输出流,进而实现预览、拍照、录像等基础功能。 开发步骤 在创建相机设备输入之前需要先完成相机设备管理,详细开发步骤可参考上一篇文章。 创建相机输入流 通过cameraMana…...
通过分治策略解决内存限制问题完成大型Hive表数据的去重的PySpark代码实现
在Hive集群中,有一张历史交易记录表,要从这张历史交易记录表中抽取一年的数据按某些字段进行Spark去重,由于这一年的数据超过整个集群的内存容量,需要分解成每个月的数据,分别用Spark去重,并保存为Parquet文…...
融媒体中心智能语音识别系统设计与实现
县级融媒体中心智能语音识别系统设计与实现 序言 随着融媒体时代的快速发展,新闻采编、专题节目制作对语音转写效率的要求日益提高。作为基层融媒体中心的技术工程师,我们在实际工作中常面临以下痛点: 采访录音整理耗时:传统人…...
学习笔记九——Rust所有权机制
🦀 Rust 所有权机制 📚 目录 什么是值类型和引用类型?值语义和引用语义?什么是所有权?为什么 Rust 需要它?所有权的三大原则(修正版)移动语义 vs 复制语义:变量赋值到底…...
计算机视觉算法实现——电梯禁止电瓶车进入检测:原理、实现与行业应用(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 电梯安全检测领域概述 近年来,随着电动自行车(以下简称"电瓶车"&…...
扩散模型 Diffusion Model 整体流程详解
🧠 Diffusion Model 思路、疑问和代码 文章目录 🧠 Diffusion Model 思路、疑问和代码🔄 一、核心思想:从噪声到图像📦 二、正向过程:加噪🧠 三、反向过程:学习去噪🎯 目…...
[Spark]深入解密Spark SQL源码:Catalyst框架如何优雅地解析你的SQL
本文内容组织形式 总结具体例子执行语句解析层优化层物理计划层执行层 猜你喜欢PS 总结 先写个总结,接下来会分别产出各个部分的源码解析,Spark SQL主要分为以下五个执行部分。 具体例子 接下来举个具体的例子来说明 执行语句 SELECT name, age FR…...
【数据结构_7】栈和队列(上)
一、概念 栈和队列,也是基于顺序表和链表实现的 栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作。 遵循后进先出的原则 此处所见到的栈,本质上就是一个顺序表/链表,但是,实在顺序表/链表的基础…...
Linux中的cat命令常见用法
在 Linux 中,cat 命令是 concatenate(连接)的缩写,意思是“连接”或“串联”。 基本功能 cat 命令的主要功能是用于查看、合并和创建文件。它会将一个或多个文件的内容输出到标准输出设备(通常是终端屏幕)…...
css - 实现三角形 div 容器,用css画一个三角形(提供示例源码)简单粗暴几行代码搞定!
效果图 如下图所示,让一个 div 变成三角形,并且可随意更改大小, 本文提供了可运行示例源码,直接复制即可。 实现源码 建议创建一个 demo.html 文件,一键复制代码运行。 <style> .div{width: 0px;height: 0px…...
springboot 项目 jmeter简单测试流程
测试内容为 主机地址随机数 package com.hainiu.example;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotat…...
设计模式实践:模板方法、观察者与策略模式详解
目录 1 模板方法1.1 模板方法基本概念1.2 实验1.2.1 未使用模板方法实现代码1.2.2 使用模板方法的代码 2 观察者模式2.1 观察者模式基本概念2.2 实验 3 策略模式3.1 策略模式基本概念3.2 实验 1 模板方法 1.1 模板方法基本概念 定义:一个操作中的算法的骨架 &…...
Google的AI模型Gemini和Gemini网络协议
粉丝私信问我:gemini如何访问? "Gemini如何访问"需明确区分两种完全不同的技术体系:Google的AI模型Gemini和Gemini网络协议。以下是两者的访问方式详解: 一、访问Google的Gemini AI模型 1. 通过Web应用 地址…...
HTTP实现心跳模块
HTTP实现心跳模块 使用轻量级的cHTTP库cpp-httplib重现实现HTTP心跳模块 头文件HttplibHeartbeat.h #ifndef HTTPLIB_HEARTBEAT_H #define HTTPLIB_HEARTBEAT_H#include <string> #include <thread> #include <atomic> #include <chrono> #include …...
基于web的民宿信息系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息时代的来临,民宿过去的民宿信息方式的缺点逐渐暴露,对过去的民宿信息的缺点进行分析,采取计算机方式构建民宿信息系统。本文通过阅读相关文献,研究国内外相关技术,提出了一种民宿信息管理、民宿信息管理…...
使用OpenSceneGraph (osg)实现一个星系漫游
简介 使用OpenSceneGraph (osg)实现了一个太阳系漫游的程序,具有以下特点: 1.通过按键控制飞行器前进后退、空间姿态; 2.星系渲染; 3.背景星空渲染; 效果 提供了一张超大的星空背景图 代码示例 int main(int a…...
笔试专题(九)
文章目录 十字爆破(暴力)题解代码 比那名居的桃子(滑动窗口/前缀和)题解代码 分组(暴力枚举 优化二分)题解代码 十字爆破(暴力) 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…...
sklearn决策树 待更新
注意:sklearn中所有的决策树模型包括回归决策树实现的是CART决策树算法,在官方文档中有介绍。sklearn中的决策树模型最终得到的树结构都是二叉树,因为CART算法生成的就是二叉树。 DecisionTreeClassifier类 如果待预测样本有多个类别具有相同…...
eino v0.3.21 重磅发布!节点中断控制+空值映射支持,AI应用开发再添神器!
CloudWeGo/eino v0.3.21 作为最新补丁版本,聚焦流程控制与数据映射两大核心场景,为AI应用与微服务开发者提供更灵活的调试能力与容错设计! 1. 节点中断控制(Feat: Node Interrupt) • 功能亮点:新增 node …...
力扣每日打卡 50. Pow(x, n) (中等)
[TOC](力扣 50. Pow(x, n) 中等) 前言 这是刷算法题的第十一天,用到的语言是JS 题目:力扣 50. Pow(x, n) (中等) 一、题目内容 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1࿱…...
Mac M1管理多个Node.js版本
目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…...
arm_math.h、arm_const_structs.h 和 arm_common_tables.h
在 FOC(Field-Oriented Control,磁场定向控制) 中,arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 库的核心组件,用于实现高效的数学运算、预定义结构和查表操作。以下是它们在 FOC 控…...
每天五分钟深度学习:非线性激活函数的导数
本文重点 本文探讨了神经网络中几种常见非线性激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Softmax)的导数特性。通过对各激活函数导数的数学推导与实际应用分析,揭示了不同激活函数在梯度传播、收敛速度及模型表达能力方面的差异。研究发现,ReLU及其变体在计算效率与…...
OpenHarmony5.0.2 USB摄像头适配
开发环境 OpenHarmony5.0.2 RK3568 USB摄像头 遇到问题 编译后插上USB摄像头后打开相机无图像 解决思路 5.0.2版本是支持USB摄像头的,需要修改默认的板载相机配置即可。 修改代码 1、修改配配置 文件地址:vendor/hihope/rk3568/hdf_config/uhdf…...
vue: router基础用法
router基础用法 1.安装router2.配置router3.路由编程1.编程式导航2.声明式导航 1.安装router 在node环境下,直接运行 npm install router42.配置router 创建文件夹并命名为router 在router文件夹中创建index.js index.js示例配置如下: import { creat…...
IDE中使用Spring Data Redis
步骤一:导入Spring Data Redis的maven坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 步骤二:配置Redis数据源 步骤三&…...
【计网】网络交换技术之报文交换(复习自用,了解,重要3)
复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记: 电路交换 分组交换 一、报文交换的定义 报文交换(Me…...
GitLab 17.x 配置 https
文章目录 使用外部 nginx 参考:https://docs.gitlab.com/omnibus/settings/nginx.html 使用内置 nginx 参考:https://docs.gitlab.com/omnibus/settings/ssl/index.html#configure-https-manually // 使用自己手工申请证书 $ mkdir /etc/gitlab/ssl $ m…...
中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)
1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发,并于2016年开源。专为大规模数据分析,实时数据分析和复杂查询设计,具有高性能、实时数据和可扩展性等…...
【编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用】
编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用; vue3-sfc-loader主要特征: 编写Node接口:Vue2项目使用:Vue3项目使用:(页面按需加载插件、图片等)主要使用&am…...
vue入门:template 和 JSX
temlplate 和 jsx 最终渲染时都是创建 dom 节点 template 和 JSX 混合使用 <template><div><span>Message: {{ msg }}</span><br/><VNodes :vnodes"getJSXSpan()"/><VNodes :vnodes"getAnchoredHeading(4)"/>…...
[Dify] Dify 本地部署及连接 Ollama 模型全流程指南
在构建私有化智能应用时,Dify 作为一款开源的大模型应用开发平台,具备强大的插件体系和可扩展能力。本文将详细介绍如何在本地环境中部署 Dify,并成功连接本地的 Ollama 模型,解决实际部署过程中常见的问题与错误。 一、本地部署 Dify 步骤详解 1. 安装 Docker 环境(以 W…...
基于PyQt5的Jupyter Notebook转Python工具
一、项目背景与核心价值 在数据科学领域,Jupyter Notebook因其交互特性广受欢迎,但在生产环境中通常需要将其转换为标准Python文件。本文介绍一款基于PyQt5开发的桌面级转换工具,具有以下核心价值: 可视化操作:提供友好的GUI界面,告别命令行操作 批量处理:支持目录递归…...
从自然语言到 JSON 数据交互:探索 MCP 协议的自动化任务实现
好的!以下是基于我们讨论的关于 MCP 协议、JSON 数据交互以及自然语言到 JSON 转换的实现过程的总结,格式化为一篇 CSDN 风格的博客记录。这篇文章将记录你的发现,适合分享给技术社区。 从自然语言到 JSON 数据交互:探索 MCP 协议…...
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使) 简介 n8n 介绍 一、高度可定制性 二、丰富的连接器生态 三、自托管部署(本地部署) 四、社区驱动 n8n 的部署 一、前期准备 二、部署步…...
嵌入式学习(37)-STM32串口发送中断的实现
一、概述 项目中需要用到发送中断,所以了解了发送中断的一些知识。 二、应用 状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE1,表明发送数据寄存器为空, TC1表明发送已完成。 USART_ITConfig(USART1, USA…...
Android envsetup与Python venv使用指南
Android envsetup 和 Python venv 是两种完全不同的环境配置工具,分别服务于不同的开发场景。以下是对它们的详细解释及使用方法: 1. Android envsetup 用途: Android envsetup 是 Android 源码开发中的环境配置脚本(envsetup.sh…...
安卓关机和重启源码流程
// systemui关机 frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java Overridepublic void shutdown() {try {mBarService.shutdown();} catch (RemoteException e) {}}frameworks/base/services/core/java/com/android…...
解决单设备号双目摄像头调用难题:经验分享与总结
解决单设备号双目摄像头调用难题:经验分享与总结 在计算机视觉项目中,双目摄像头的调用是常见需求,但过程中往往会遇到各种挑战。最近,我就经历了一段曲折但最终成功解决问题的历程,现在将这段宝贵经验分享给大家。 一、问题背景 我手头的双目摄像头仅有一个设备号(设…...
【RL系列】DAPO: An Open-Source LLM Reinforcement Learning System at Scale
1. 简介 尽管RL对complex reasoning效果提升有重要作用,但是在openAI o1和DeepSeek R1 technical report上都没有详细的实验细节。本文主要提出了DAPO算法,提出了4个关键技术点并开源参数和代码。在AIME 2024验证了DAPO算法的有效性。 2. Tricks Exc…...
五子棋(测试报告)
文章目录 一、项目介绍二、测试用例三、自动化测试用例的部分展示注册登录游戏大厅游戏匹配 总结 一、项目介绍 本项目是一款基于Spring、SpringMVC、MyBatis、WebSocket的双人实时对战五子棋游戏,游戏操作便捷,功能清晰明了。 二、测试用例 三、自动化测试用例的…...
【小工具】定时任务执行器
定时任务执行器 背景版本代码JobJob执行机 背景 有时我们的项目内需要一个定时执行器来执行某些任务,就需要一个简单好用的定时任务机。 注意,这个定时任务机并不原生支持分布式,如果需要分布式的功能请自己实现。 版本 jdk21 代码 Job …...
LVGL源码(7):渲染
在LVGL源码(4):LVGL关于EVENT事件的响应逻辑_lvgl实现显示打车-CSDN博客这篇文章中,我们提到了LVGL的三大步骤:检测用户输入操作、调用我们编写的逻辑、在屏幕上显示对应的画面;而在学习完“样式”之后,我们或许可以将上述步骤说明…...
02_通过调用硅基流动平台deepseekapi按输入的标题生成文章
from openai import OpenAIclient OpenAI(base_urlhttps://api.siliconflow.cn/v1,api_keyyou api-key )# 定义关键词变量 keyword "人性的弱点都有哪些?"# 发送带有流式输出的请求 response client.chat.completions.create(model"deepseek-ai/D…...