C++STL---<functional>
C++标准库中的 <functional>
库是一个强大的工具集,它提供了用于处理函数对象、函数绑定、函数包装等功能的设施,极大地增强了代码的灵活性和可复用性。
1. 函数对象(Functors)
函数对象,也被称作仿函数,是重载了 ()
运算符的类的实例。其使用方式与普通函数调用类似,但函数对象可以携带状态,这使得它比普通函数更加灵活。
#include <iostream>// 定义一个函数对象类
class Adder {
public:int operator()(int a, int b) const {return a + b;}
};int main() {Adder adder;int result = adder(3, 4);std::cout << "3 + 4 = " << result << std::endl;return 0;
}
- 原理:在
Adder
类中,重载了()
运算符,该运算符接受两个int
类型的参数并返回它们的和。Adder
类的对象adder
就可以像函数一样被调用,当调用adder(3, 4)
时,实际上是调用了Adder
类的operator()
方法。 - 优点:函数对象可以包含成员变量,这些成员变量可以在对象创建时进行初始化,并且在多次调用
operator()
时保持状态,这是普通函数无法做到的。
2. std::function
std::function
是一个通用的多态函数包装器,它可以存储、复制和调用任何可调用对象,包括普通函数、函数指针、成员函数指针、函数对象和 lambda 表达式等。
#include <iostream>
#include <functional>// 普通函数
int add(int a, int b) {return a + b;
}int main() {// 使用 std::function 包装普通函数std::function<int(int, int)> func = add;int result = func(3, 4);std::cout << "3 + 4 = " << result << std::endl;// 包装 lambda 表达式std::function<int(int, int)> lambdaFunc = [](int a, int b) { return a * b; };result = lambdaFunc(3, 4);std::cout << "3 * 4 = " << result << std::endl;return 0;
}
- 模板参数:
std::function<int(int, int)>
中的模板参数指定了可调用对象的签名,即接受两个int
类型的参数并返回一个int
类型的结果。 - 包装过程:当将普通函数
add
或 lambda 表达式赋值给std::function
对象时,std::function
会内部存储该可调用对象,并提供统一的调用接口。当调用func(3, 4)
或lambdaFunc(3, 4)
时,std::function
会根据存储的可调用对象进行相应的调用。 - 用途:
std::function
常用于实现回调机制,例如在事件处理、多线程编程等场景中,通过std::function
可以方便地传递和调用不同类型的可调用对象。
3. std::bind
std::bind
用于创建一个新的可调用对象,它将一个可调用对象和其部分或全部参数绑定在一起,允许进行部分参数绑定和参数重排。
#include <iostream>
#include <functional>// 普通函数
int add(int a, int b) {return a + b;
}int main() {// 使用 std::bind 绑定 add 函数的第一个参数为 3auto add3 = std::bind(add, 3, std::placeholders::_1);int result = add3(4);std::cout << "3 + 4 = " << result << std::endl;// 参数重排auto sub = [](int a, int b) { return a - b; };auto reversedSub = std::bind(sub, std::placeholders::_2, std::placeholders::_1);result = reversedSub(3, 4);std::cout << "4 - 3 = " << result << std::endl;return 0;
}
- 部分参数绑定:在
std::bind(add, 3, std::placeholders::_1)
中,add
是要绑定的可调用对象,3
是第一个参数,std::placeholders::_1
是一个占位符,表示新可调用对象的第一个参数。add3
是一个新的可调用对象,当调用add3(4)
时,实际上是调用add(3, 4)
。 - 参数重排:在
std::bind(sub, std::placeholders::_2, std::placeholders::_1)
中,通过占位符的顺序交换了sub
函数的参数顺序。当调用reversedSub(3, 4)
时,实际上是调用sub(4, 3)
。 - 用途:
std::bind
可以用于简化函数调用,特别是在需要固定部分参数的情况下,或者在需要对参数顺序进行调整的情况下。
4. std::mem_fn
std::mem_fn
用于创建一个可调用对象,该对象可以调用类的成员函数。它可以处理成员函数指针,使得调用成员函数更加方便。
#include <iostream>
#include <functional>class MyClass {
public:void print() const {std::cout << "Hello, World!" << std::endl;}int add(int a, int b) const {return a + b;}
};int main() {MyClass obj;// 使用 std::mem_fn 包装成员函数auto printFunc = std::mem_fn(&MyClass::print);printFunc(obj);auto addFunc = std::mem_fn(&MyClass::add);int result = addFunc(obj, 3, 4);std::cout << "3 + 4 = " << result << std::endl;return 0;
}
- 成员函数指针:
&MyClass::print
和&MyClass::add
是成员函数指针,它们指向MyClass
类的print
和add
成员函数。 - 包装过程:
std::mem_fn
接受成员函数指针作为参数,返回一个可调用对象。当调用printFunc(obj)
时,std::mem_fn
会将obj
作为调用print
成员函数的对象,从而实现成员函数的调用。同样,addFunc(obj, 3, 4)
会调用obj
的add
成员函数,并传递3
和4
作为参数。 - 用途:
std::mem_fn
使得成员函数的调用可以像普通函数调用一样方便,特别是在需要将成员函数作为参数传递给其他函数时非常有用。
5. 预定义的函数对象
<functional>
库提供了一系列预定义的函数对象,用于常见的操作,如算术运算、比较运算等。
算术运算
#include <iostream>
#include <functional>int main() {std::plus<int> add;int result = add(3, 4);std::cout << "3 + 4 = " << result << std::endl;std::minus<int> sub;result = sub(4, 3);std::cout << "4 - 3 = " << result << std::endl;return 0;
}
std::plus
:std::plus<int>
是一个预定义的函数对象,它重载了()
运算符,用于执行两个int
类型数的加法运算。当调用add(3, 4)
时,实际上是调用了std::plus<int>
的operator()
方法,返回3 + 4
的结果。std::minus
:std::minus<int>
用于执行两个int
类型数的减法运算,其原理与std::plus
类似。
比较运算
#include <iostream>
#include <functional>int main() {std::greater<int> greater;bool isGreater = greater(4, 3);std::cout << "4 > 3: " << (isGreater ? "true" : "false") << std::endl;std::less<int> less;isGreater = less(4, 3);std::cout << "4 < 3: " << (isGreater ? "true" : "false") << std::endl;return 0;
}
std::greater
:std::greater<int>
用于比较两个int
类型数的大小,返回true
表示第一个参数大于第二个参数。当调用greater(4, 3)
时,返回true
。std::less
:std::less<int>
用于比较两个int
类型数的大小,返回true
表示第一个参数小于第二个参数。当调用less(4, 3)
时,返回false
。
6. std::ref
和 std::cref
std::ref
和 std::cref
用于创建引用包装器,当需要将引用传递给 std::bind
或其他需要按值传递参数的地方时非常有用。
#include <iostream>
#include <functional>void increment(int& num) {++num;
}int main() {int num = 3;auto func = std::bind(increment, std::ref(num));func();std::cout << "num = " << num << std::endl;return 0;
}
std::ref
:std::ref(num)
创建了一个对num
的引用包装器。在std::bind(increment, std::ref(num))
中,由于increment
函数接受一个引用参数,使用std::ref
可以确保传递给increment
的是num
的引用,而不是num
的副本。当调用func()
时,increment
函数会修改num
的值。std::cref
:std::cref
与std::ref
类似,但它创建的是一个常量引用包装器,用于传递常量引用。
7. std::hash
std::hash
是一个模板类,用于生成对象的哈希值,常用于实现哈希表等数据结构。
#include <iostream>
#include <functional>int main() {std::hash<int> hasher;int num = 3;std::size_t hashValue = hasher(num);std::cout << "Hash value of " << num << " is " << hashValue << std::endl;return 0;
}
- 哈希函数:
std::hash<int>
是一个针对int
类型的哈希函数模板类,它重载了()
运算符,接受一个int
类型的参数并返回一个std::size_t
类型的哈希值。当调用hasher(num)
时,会根据num
的值生成一个对应的哈希值。 - 用途:在实现哈希表、哈希集合等数据结构时,
std::hash
可以方便地为元素生成哈希值,从而实现快速的查找和插入操作。
8. std::not_fn
(C++17 起)
std::not_fn
用于创建一个新的可调用对象,该对象返回原可调用对象结果的逻辑非。
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>bool isEven(int num) {return num % 2 == 0;
}int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};auto isOdd = std::not_fn(isEven);auto oddCount = std::count_if(numbers.begin(), numbers.end(), isOdd);std::cout << "Number of odd numbers: " << oddCount << std::endl;return 0;
}
- 逻辑非操作:
std::not_fn(isEven)
创建了一个新的可调用对象isOdd
,当调用isOdd
时,它会调用isEven
并返回其结果的逻辑非。在std::count_if
中使用isOdd
可以统计numbers
向量中奇数的个数。 - 用途:
std::not_fn
可以方便地反转一个布尔函数的逻辑,避免手动编写反转逻辑的代码。
总结
<functional>
库提供了丰富的工具来处理函数对象和函数调用,通过这些工具可以提高代码的灵活性和可维护性。合理使用这些工具可以让代码更加简洁和高效,特别是在实现回调机制、函数绑定、成员函数调用等场景中发挥重要作用。
相关文章:
C++STL---<functional>
C标准库中的 <functional> 库是一个强大的工具集,它提供了用于处理函数对象、函数绑定、函数包装等功能的设施,极大地增强了代码的灵活性和可复用性。 1. 函数对象(Functors) 函数对象,也被称作仿函数…...
【Android】BluetoothSocket.connect () 的实现与协议栈交互源码解析
本文以 Android 蓝牙框架中的BluetoothSocket.connect()方法为切入点,深入剖析 Android 设备与远程蓝牙设备建立连接的全流程。从 Java 层的 API 调用出发,逐步追踪至 JNI 层的接口转发,最终进入 Buedroid 协议栈(RFCOMM/L2CAP 层),揭示蓝牙连接的核心机制。重点解析了权…...
算法导论(动态规划)——简单多状态
算法思路(17.16) 状态表示: 在处理线性动态规划问题时,我们可以通过“经验 题目要求”来定义状态表示。通常有两种选择: 以某个位置为结尾的情况;以某个位置为起点的情况。 本题中,我们选择更常…...
主成分分析(PCA)学习介绍及其高阶应用,金融风险分析
前言 主成分分析(Principal Component Analysis, PCA)是统计学中一种重要的降维技术。它通过寻找数据中各特征之间的线性关系,来降低数据的维度,同时保留数据中的主要信息。PCA在机器学习、信号处理、图像处理等领域广泛应用&…...
利用 SSRF 和 Redis 未授权访问进行内网渗透
目录 环境搭建 编辑 发现内网存活主机 编辑 扫描内网端口 编辑 利用 Redis 未授权访问进行 Webshell 写入 步骤1:生成 payload 方式1:使用python生成 payload 方式二:使用 Gopher 工具 步骤 2:写入 Webshell…...
计算机网络和因特网
目录 1、什么是Internet? 1.1定义 1.2具体构成描述 2、什么是协议? 2.1 服务描述 2.2 网络协议 3、网络边缘 3.1 定义与组成 3.2 模式 3.3服务 4、接入网、物理媒介 4.1、宽带有线接入网技术 4.2、宽带无线接入网技术 5、网络核心…...
1.oracle修改配置文件
1.找到oracle的安装路径 D:\app\baozi\product\11.2.0\dbhome_1\NETWORK\ADMIN ,修改下面的两个文件。如果提示没有权限,可以先把这两个文件复制到桌面,修改完后,在复制回来。 2.查看自己电脑的主机名, 右击 - 此电脑 …...
算法篇-------------双指针法
温馨提示:由于c语言在编程上更有优势,更加简洁,本文代码均为c代码,其他语言也可以 做,思想是不变的! 1.应用场景 涉及到对数组的操作的题目,可以考虑双指针方法解决 2.基…...
Java关于包和final
什么是包? 包就是文件夹。用来管理等各种不同功能的java类,方便后期代码维护 包名的规则:公司域名反写包的作用,需要全部英文小写,见名知意。例如:com.pdsu.domain package com.pdsu.demain;public class…...
2025年华为HCIP题库分享
1101、 【拖拽题】OPSF邻接关系建立的过程中需要使用不同的报文,那么请分别将以下各个状态和该状态使用的报文联系起来。 答题格式为:11 22 33 43 正确答案:【12】【21】【24】【33】 解析: 建立邻居关系 RouterA的一个连接到广…...
49. 字母异位词分组
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 先把每一个词都排序,拍完之后相同的就是字母异位词使用map,排序完的作为key,一个string数组作为value对于每一个词,排完序之后将…...
python 语法篇(一)
目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数(1)re.search()--搜索第一个匹配项(2)re.match() - 从字符串开头匹配(3)re.findall() - 返回所有匹配项的列表(4)re.fi…...
机器学习ML极简指南
机器学习是现代AI的核心,从推荐系统到自动驾驶,无处不在。但每个智能应用背后,都离不开那些奠基性的模型。本文用最简练的方式拆解核心机器学习模型,助你面试时对答如流,稳如老G。 线性回归 线性回归试图通过"最…...
爬虫:网络请求(通信)步骤,http和https协议
电脑(浏览器):www.baidu.com——url DNS服务器:IP地址标注服务器——1.1.38 DNS服务器返回IP地址给浏览器 浏览器拿到IP地址去访问服务器,返回响应 服务器返回给响应数据:html/css/js/jpg... html:文本 cs…...
【杂谈】-大型语言模型对具身人工智能发展的推动与挑战
大型语言模型对具身人工智能发展的推动与挑战 文章目录 大型语言模型对具身人工智能发展的推动与挑战1. 具身人工智能(Embodied AI)的内涵解析2. 大型语言模型的功能与作用3. 最新发展趋势4. 面临的挑战与考量因素5. 总结与展望 多年来,研发能…...
解决Beats Solo Buds 无法自动切换音频到耳机的问题
一、核心问题定位 现象矛盾点: Beats 耳机能连接但需手动切换音频 AirPods 可自动切换 → 排除 iOS 系统级故障 问题可能源于 Beats 固件兼容性 或 音频路由逻辑冲突 关键差异: 设备 芯片类型 自动切换协议支持 固件更新方式 AirPods 二代 H1芯片 原…...
MySQL基本查询
一.create 1.1 单行数据 全列插入 1.2 多行数据 指定列插入 1.3插入否则更新 1.4替换 二.Retrieve 2.1.SELECT列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4 为查询结果指定别名 2.1.5结果去重 2.2WHERE 条件 2.2.1比较运算符 2.2.3逻辑运算符…...
面基:为什么不推荐用UUID作为主键
推荐回答结构: 技术理论层面分析 实际项目中的教训 优化改进过程 总结提炼认知 阐述回答 在阐述回答时,你可以从 UUID 本身特性带来的问题,以及在实际工作中遇到的具体场景和优化过程等方面展开,下面从这一思路,给…...
oracle 常用函数的应用
在使用开发中会经常遇到数据类型转换、显示系统时间等情况,需要使用函数来实现。通过函数来实现业务需求会非常的省事便捷,函数可以用在适当的dml语句和查询语句中。 Oracle 数据库中主要使用两种类型的函数: (1)单行函数:对每一个…...
ubuntu的ubuntu--vg-ubuntu--lv磁盘扩容
在我们安装ubuntu时,如果选择的是自动分区,就会按照逻辑卷的形式来分区,并且只分配100G其余的并不会被分配,这对我们大多数情况来说都是不合理的,所以,如何扩充呢 下面以一个小的案例来说明如何扩充 问题…...
鬼泣:升龙系统
文章目录 0.升龙系统:升龙斩使敌人浮空升龙斩使敌人浮空:设置flying状态,不会落下 1.升龙斩:S 攻击S按下calculate directionin range warp:前提是根运动打开蒙太奇拔刀收刀canCombo:接轻攻击连击 2. A.向…...
UI产品经理基础(四):用价值链视角来分析项目需求
用价值链视角来分析项目需求 作为产品经理,从价值链视角分析项目需求,能够更精准地定位价值创造的关键环节,确保资源投入与用户需求、商业目标深度匹配。以下是系统化的方法论与落地步骤,结合案例说明如何实现需求分析与用户认可…...
ThinkPHP的“get\post\put\delete“请求
首先了解一下这四个请求的区别 1.GET 请求 用途:获取资源(只读操作,不修改服务器数据)。 特点: 参数通过 URL 的 查询字符串(Query String) 传递(例如 /book?id1)。 数…...
目标检测的训练策略
在目标检测竞赛中,训练策略的优化是提高模型性能的关键。常用的训练策略包括数据预处理、数据增强、超参数调节、损失函数设计、正负样本采样、模型初始化和训练技巧等。以下是一些常见的训练策略: 1. 数据预处理与数据增强 数据归一化:对输…...
【JavaSE】小练习 —— 图书管理系统
【JavaSE】JavaSE小练习 —— 图书管理系统 一、系统功能二、涉及的知识点三、业务逻辑四、代码实现4.1 book 包4.2 user 包4.3 Main 类4.4 完善管理员菜单和普通用户菜单4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书.....…...
代码随想录Day29
Day29 动态规划part02 LeetCode 62.不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &…...
Python入门(3):语句
目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环: for循环: 2.3 流程控制语句 1. break语句:退出整个循环体 2. continue语句:只跳过本次循环,还会进…...
04_SQL概述及DDL
文章目录 一、关于SQL1.1、SQL概述1.2、SQL分类 二、数据库操作2.1、查看数据库2.2、切换数据库2.3、查询当前使用的数据库2.4、创建数据库2.5、查看数据库创建信息2.6、修改数据库2.7、删除数据库 三、表的操作3.1、数据类型3.1.1、数值类型3.1.2、字符串类型3.1.3、日期时间类…...
如何调整yarn.nodemanager.vmem-pmem-ratio参数?
调整 yarn.nodemanager.vmem - pmem - ratio 参数,可参考以下步骤: 打开YARN配置文件 找到 yarn - site.xml 文件,该文件通常位于Hadoop配置目录中,例如 /etc/hadoop/conf 或 /opt/module/hadoop - 3.1.3/etc/hadoop 。 找到并修改…...
【质量管理】质量的系统是预防,那以预防为主的质量管理系统包括什么?
“质量的系统是预防”这是克劳士比零缺陷管理四项基本原则的第二项基本原则。什么样的系统才是一个以预防为主的质量管理系统呢? 一个以预防为主的质量系统,必须包括三大方面:质量检验系统、质量保证系统、质量管理系统。 举个例子࿱…...
JavaScript 事件流与事件委托
目录 一、事件流、事件捕获与事件冒泡 1. 事件流(Event Flow) 2. 事件捕获(Event Capturing) 3. 事件冒泡(Event Bubbling) 4. 阻止事件冒泡 5. 事件解绑 6. 实际应用场景 二、事件委托 1. 什么是…...
RAG 优化 Embedding 模型或调整检索策略
在 RAG(Retrieval-Augmented Generation)系统中,优化 Embedding 模型和调整检索策略是提升检索质量的核心手段。以下是系统化的优化方法和实践指南: 一、优化 Embedding 模型 Embedding 模型的质量直接决定检索的召回率(Recall)和准确率(Precision)。优化方向包括: …...
Sentinel[超详细讲解]-3
主要讲解🚀 - 基于QPS/并发数的流量控制 1、流控规则 流量控制(Flow Control)用于限制某个资源的访问频率,防止系统被瞬时的流量高峰冲垮。流量控制规则可以针对不同的资源进行配置,例如接口、方法、类等。 流量规则的…...
vue3使用i18n$t()无法获取数组和对象
今天在使用i18n进行国际化时,定义了数组和对象节点,但是用$t()无法获取,只能返回字符串值,查询相关材料,解决方案如下: 使用新的api替换即可,$t > $tm 参考文章(深表谢意):vue -…...
机器学习的一百个概念(5)数据增强
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
(Kotlin)Android 高效底部导航方案:基于预定义 Menu 和 ViewPager2 的 Fragment 动态绑定实现
支持预定义 Menu 并绑定 Fragment,同时保留动态添加 Tab 的能力 BottomTabHelper.kt package smartconnection.com.smartconnect.home.utilimport android.content.Context import android.util.SparseArray import androidx.annotation.IdRes import androidx.fra…...
零基础入门多媒体音频(4)-GENIVIProjectAudioManager总览
GENIVI Project的AudioManager是一个专门设计用于汽车信息娱乐系统的音频管理解决方案。它负责管理和控制车辆内的音频源和音频路径,确保各种音频信号能够正确、高效地在车辆的音响系统中传输和播放。 AudioManager的核心功能包括音频源的管理、音频路径的控制以及音…...
DeepSeek协助优化-GTX750Ti文物显卡0.65秒卷完400MB float 音频512阶时域FIR
文章目录 1. 学习目的2. 阶段成果2.1 NVVP 性能探查2.2 测试编译环境2.3 测试样例 3 学习过程3.1 提问DeepSeek3.2 最终代码 4. 体会 1. 学习目的 最近在学习cuda,准备给我的taskBus SDR添加CUDA的模块支持,以便可以用PC机压榨山寨 B210那56M的带宽。 因…...
Embedding原理
Embedding(嵌入)是将离散符号(如单词)映射到连续向量空间的核心技术,其本质是语义的数学化表示。以下是其核心原理详解: 一、基础概念图解 graph LRA[单词猫] --> B[索引5] --> C[向量[0.2, -1.3,…...
Spark,配置hadoop集群1
配置运行任务的历史服务器 1.配置mapred-site.xml 在hadoop的安装目录下,打开mapred-site.xml,并在该文件里面增加如下两条配置。 eg我的是在hadoop199上 <!-- 历史服务器端地址 --> <property><name>mapreduce.jobhistory.address…...
人工智能大模型-数据预处理-文本数据预处理-图像数据预处理
文本数据预处理 大模型常用的文本数据类型 通用文本数据:网页、对话和图书资料等专用文本数据:多语言文本、科学文本、代码和指令等 构造方法 指令数据:指令(instruction)、输入(input)、输出(output)3部分组成 如果在instruction部分已…...
怎么使用嵌套虚拟环境实现项目部署之virtualenv嵌套conda绕开安装环境检测实现.venv部署facefusion
#工作记录 一、前言 嵌套虚拟环境本来是不建议的一种方法,这种嵌套虚拟环境的使用有一定特殊性,但在一些特别的使用场景下,嵌套虚拟环境的使用非常有用。 二、嵌套虚拟环境: (一)conda嵌套virtualenv 该…...
ansible介绍以及安装
一.ansible介绍 实现对IT基础设施的批量管控,加快效率,节省工作时间。 1.ansible特性 1.基于python开发,开源, 2.基于ssh协议工作。只需要确保ansible机器,与被控制机器能连通就好了, 3.no server 无…...
GPT-4o图像生成功能:技术突破与隐忧并存
2025年3月25日,OpenAI正式推出GPT-4o原生图像生成功能,宣称其实现了“文本到图像的终极跨越”。然而,这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流,暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...
Java 时间处理:轻松掌握 java.time 包
前言 在 Java 开发中,日期和时间处理一直是令人头疼的问题。传统的 Date 和 Calendar 类不仅复杂,还充满了线程安全和时区处理的坑。Java 8 引入的 java.time 包彻底改变了这一局面,带来了现代化、直观且功能强大的日期时间 API。 本…...
Vue项目中Vuex在util引入,断点存在default
示例代码 // src/store/index.js import Vue from vue; import Vuex from vuex; ……Vue.use(Vuex); export default new Vuex.Store({…… })// src/utils/index.js import store from /store // 导入默认导出的 store export async function getDict() {store.state.userInf…...
2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议
——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代:新能源赛道「超级独角兽」 作为全球动力电池龙头,宁德时代(CATL)的江湖地位无需多言: 技术硬实力:麒麟电池、钠离子电池、无钴电池等黑科技加持&…...
谈谈常见的数据结构(如数组、链表、栈、队列、哈希表、树、图)及其应用场景
一、数组(Array) 定义:连续存储相同类型数据的线性结构,支持随机访问。 应用场景:列表渲染、数据缓存、算法处理 代码示例: // 数组基本操作 const arr [1, 2, 3, 4]; arr.push(5); // O(1) 平均时间复杂…...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控
答应我,这篇一定要看到最后~! <前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&a…...
【算法】快速幂
一、概念 快速幂是一种高效的指数运算,当指数范围过大时,通过位运算能够减少大量的计算次数 对于,我们通过将指数b转化为二进制数,就可以将分解为许多的(其中i是指数b中对应位为1的位数) 例如࿰…...