代码随想录八股训练营第三十九天| C++
前言
一、说一下 lambda函数?
1.1.Lambda 函数的一般语法如下:
1.2.捕获子句:
二、C++ 怎么实现一个单例模式?
2.1.懒汉式(线程不安全):
2.2.饿汉式(线程安全):
2.3.双重检查锁定(线程安全):
2.4.单例模式的变体:使用 std::call_once(C++11):
总结
前言
在现代软件开发中,设计模式是解决常见问题的一种可重用方案。单例模式是其中的一种模式,它确保一个类只有一个实例,并提供一个全局访问点。此外,Lambda 函数在 C++11 及更高版本中提供了一种编写匿名函数的便捷方式,它们在需要简短函数对象时非常有用。
一、说一下 lambda函数?
在 C++ 中,lambda 函数(也称为 lambda 表达式)是一种便捷的匿名函数定义方式,它允许你在不定义传统函数的情况下创建函数对象。Lambda 函数在 C++11 标准中被引入,并且成为了 C++14 和 C++17 标准的一部分。Lambda 函数通常用于简短的操作,或者作为参数传递给函数,特别是那些接受函数对象作为参数的算法,如 std::sort、std::for_each 等。
1.1.Lambda 函数的一般语法如下:
- capture:捕获子句,用于指定 lambda 函数可以从封闭作用域中捕获哪些变量。可以是值捕获(通过复制)、引用捕获(通过引用)或默认捕获(通过值或引用,取决于变量的类型)。
- parameters:参数列表,与普通函数参数列表类似。
- return_type:返回类型,如果 lambda 函数体中包含单一的返回语句,可以省略返回类型。
- function body:函数体,包含 lambda 函数的代码。
[capture] (parameters) -> return_type {// function body
}
1.2.捕获子句:
- 值捕获:使用等号
=后跟要捕获的变量列表。 - 引用捕获:使用
&后跟要捕获的变量列表。 - 混合捕获:可以同时使用值捕获和引用捕获。
- 默认捕获:不写捕获子句时,默认不捕获任何变量。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};// 使用 lambda 表达式对向量进行排序std::sort(nums.begin(), nums.end(), [](int a, int b) {return a > b; // 降序排序});// 使用 lambda 表达式打印向量中的元素std::for_each(nums.begin(), nums.end(), [](int n) {std::cout << n << " ";});return 0;
}
//值捕获(Value Capture)
//在值捕获中,lambda 函数内部的变量是外部变量的副本。任何对这些变量的修改都不会影响原始变量。
int outer_var = 10;
auto lambda = [outer_var]() {std::cout << "Value capture: " << outer_var << std::endl;outer_var = 20; // 修改的是副本,不会影响 outer_var
};
std::cout << "Original value: " << outer_var << std::endl; // 输出 10
lambda(); // 输出 Value capture: 10,然后输出 Original value: 10
//引用捕获(Reference Capture)
//在引用捕获中,lambda 函数内部的变量是对外部变量的引用。对这些变量的修改会影响原始变量。
int outer_var = 10;
auto lambda = [&outer_var]() {std::cout << "Reference capture: " << outer_var << std::endl;outer_var = 20; // 修改的是原始变量
};
std::cout << "Original value: " << outer_var << std::endl; // 输出 20
lambda(); // 输出 Reference capture: 20,然后输出 Original value: 20
//混合捕获(Mixed Capture)
//可以同时使用值捕获和引用捕获。
int value_var = 1;
int& ref_var = value_var;
auto lambda = [value_var, &ref_var]() {std::cout << "Mixed capture - value: " << value_var << ", ref: " << ref_var << std::endl;value_var = 2;ref_var = 3;
};
std::cout << "Original value: " << value_var << ", ref: " << ref_var << std::endl; // 输出 Original value: 1, ref: 1
lambda(); // 输出 Mixed capture - value: 1, ref: 1,然后输出 Original value: 2, ref: 3
//默认捕获(Default Capture)
//如果不指定捕获方式,lambda 函数不会捕获任何外部变量。
int outer_var = 10;
auto lambda = [] {std::cout << "Default capture: " << outer_var << std::endl; // 错误:outer_var 在这里未定义
};
// lambda(); // 这将导致编译错误,因为 outer_var 没有被捕获
二、C++ 怎么实现一个单例模式?
单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在 C++ 中实现单例模式有多种方法,下面介绍两种常见的实现方式:
2.1.懒汉式(线程不安全):
- 这种方式在第一次使用时才创建实例,但它不是线程安全的。
class Singleton {
private:static Singleton* instance;Singleton() {} // 构造函数public:// 禁止拷贝和赋值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}
};// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
2.2.饿汉式(线程安全):
- 这种方式在程序启动时就创建实例,它是线程安全的,但可能会增加程序启动时间。
class Singleton {
private:Singleton() {} // 构造函数Singleton(const Singleton&) = delete; // 禁止拷贝Singleton& operator=(const Singleton&) = delete; // 禁止赋值public:static Singleton& getInstance() {static Singleton instance; // 局部静态变量return instance;}
};
2.3.双重检查锁定(线程安全):
- 这种方式在第一次使用时才创建实例,并且是线程安全的。
#include <mutex>class Singleton {
private:Singleton() {} // 构造函数Singleton(const Singleton&) = delete; // 禁止拷贝Singleton& operator=(const Singleton&) = delete; // 禁止赋值static Singleton* instance;static std::mutex mutex;public:static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mutex);if (instance == nullptr) {instance = new Singleton();}}return instance;}
};// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
2.4.单例模式的变体:使用 std::call_once(C++11):
- 这种方式使用
std::call_once确保线程安全,并且延迟实例的创建。
#include <mutex>class Singleton {
private:Singleton() {} // 构造函数Singleton(const Singleton&) = delete; // 禁止拷贝Singleton& operator=(const Singleton&) = delete; // 禁止赋值static Singleton* instance;static std::once_flag once;public:static Singleton* getInstance() {std::call_once(once, []() {instance = new Singleton();});return instance;}
};// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::once;
总结
Lambda 函数和单例模式都是现代 C++ 编程中的重要概念。Lambda 函数提供了一种灵活的方式来编写简短的匿名函数,而单例模式则是一种确保类只有一个实例的设计模式。在多线程环境中实现单例模式时,需要特别注意线程安全。C++11 提供了 std::call_once 和 std::once_flag 这样的工具来帮助我们以线程安全的方式实现单例模式,而 Lambda 函数则因其简洁和表达力而成为编写算法和处理数据集时的首选。通过合理运用这些特性,我们可以编写出既高效又安全的代码。
相关文章:
代码随想录八股训练营第三十九天| C++
前言 一、说一下 lambda函数? 1.1.Lambda 函数的一般语法如下: 1.2.捕获子句: 二、C 怎么实现一个单例模式? 2.1.懒汉式(线程不安全): 2.2.饿汉式(线程安全): 2.3.双重检查锁定ÿ…...
服务网关工作原理,如何获取用户真实IP?
文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器(案例:获取用户真实IP地址) (★) 补充1:不同类型的客户端如何设…...
单链表的实现(C语言)
目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构,物理结构不连续,逻辑结构是连续的,在计算机中链表的实际存储是按照一个结点内存放…...
sql语句的训练2024/9/9
1题 需要看清思路:不是将数据库中的device_id的名字改为user_infors_example,而是在查找的时候,需要将device_id看成user_infors_example来进行查找。 答案 select device_id AS user_infos_example FROM user_profile limit 2 2 当固定查找…...
【QT】常用控件-下
欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻QComboBox👉🏻 QSpinBox👉🏻QDateTimeEdit👉🏻QD…...
828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统
828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&a…...
25虾皮笔试shopee笔试测评sea笔试测评题型
虾皮笔试shopee笔试测评用的自己的笔试系统,全英文笔试: 1.Numerical Reasoning Test:10题,言语推断和数学计算 2. Verbal Reasoning Test:10题,言语理解,每题一段英文材料,选对错…...
启明云端乐鑫代理商,乐鑫ESP32无线芯片方案,物联网设备WiFi联动控制
随着智能和远程技术的飞速发展,物联网(IoT)逐渐出现在我们生活的每一个角落。乐鑫以其创新的无线通信技术,正成为智能家居、工业自动化和医疗设备等领域的推动者。 无线WiFi芯片模组不仅提供了强大的数据处理能力,还赋予了设备以直观的交互方…...
希尔排序/选择排序
前言: 本篇主要对常见的排序算法进行简要分析,代码中均以数组 arr[] { 5, 3, 9, 6, 2, 4, 7, 1, 8 } 为例,进行升序排列。 常见的排序算法有如下: 选择排序中,直接选择排序没有任何实际与教育意义,而堆排…...
漫谈设计模式 [16]:中介者模式
引导性开场 菜鸟:老鸟,我最近在开发一个聊天应用的时候遇到了点问题。每个用户都需要与其他用户直接通信,这让我在代码中写了很多复杂的逻辑来管理这些联系。这样下去,代码越来越难维护了。你有什么建议吗? 老鸟&…...
深度学习-物体检测YOLO(You only look once)
目录 一:YOLO算法的网络结构 流程 1.图像分割 2.图片在网格中的处理 3.非极大值抑制 二:训练 三:分类误差 四:与Faster R-CNN对比 一:YOLO算法的网络结构 GooleNet4个卷积2个全连接层 流程 输入原始图片resize到…...
redisson中的分布式锁
我的博客大纲 我的后端学习大纲 a.redisson概述: 1.Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)2.redisson介绍官方文档地址:3.Redisson它不仅提供了一系列的分布式的Java常用对象,还…...
如何将镜像推送到docker hub
前言 这一篇应该是最近最后一篇关于docker的博客了,咱来个有始有终,将最后一步——上传镜像给他写完,废话不多说,直接进入正题。 登录 首先需要确保登录才能推送到你的仓库中去,在终端输入docker login,输入用户名和…...
GO 匿名函数
GO 匿名函数 文章目录 GO 匿名函数1. **回调函数**2. **goroutine 中的操作**3. **延迟操作(defer)**4. **内联处理逻辑**5. **闭包**6. **过滤、映射等函数式编程风格**7. **测试中的临时逻辑**8. **短期存在的逻辑操作**总结 匿名函数在 Go 语言中的使…...
JuiceFS 在多云架构中加速大模型推理
在大模型的开发与应用中,数据预处理、模型开发、训练和推理构成四个关键环节。本文将重点探讨推理环节。在之前的博客中,社区用户 BentoML 和贝壳的案例提到了使用 JuiceFS 社区版来提高模型加载的效率。本文将结合我们的实际经验,详细介绍企…...
【DCL】Dual Contrastive Learning for General Face Forgery Detection
文章目录 Dual Contrastive Learning for General Face Forgery Detectionkey points:贡献方法数据视图生成对比学习架构实例间对比学习实例内对比学习总损失函数实验实验细节定量结果跨数据集评估跨操作评估消融实验可视化Dual Contrastive Learning for General Face Forgery…...
https的特点
https的特点 优点:缺点:HTTPS是如何保证安全的? 优点: 使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器;使用HTTPS协议可以进行加密传输、身份认证,通信更加安全、防止…...
〖open-mmlab: MMDetection〗解析文件:mmdet/models/losses/cross_entropy_loss.py
目录 深入解析MMDetection中的CrossEntropyLoss及其应用1. 概述2. 核心函数2.1 cross_entropy2.1.1 函数定义和参数说明2.1.2 函数体2.1.3 总结 2.2 binary_cross_entropy2.2.1 _expand_onehot_labels函数2.2.2 binary_cross_entropy函数2.2.3 总结 2.3 mask_cross_entropy2.3.…...
【PyTorch单点知识】torch.nn.Embedding模块介绍:理解词向量与实现
文章目录 0. 前言1. 基础介绍1.1 基本参数1.2 可选参数1.3 属性1.4 PyTorch源码注释 2. 实例演示3. embedding_dim的合理设定4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但…...
Jedis 操作 Redis 数据结构全攻略
Jedis 操作 Redis 数据结构全攻略 一 . 认识 RESP二 . 前置操作2.1 创建项目2.2 关于开放 Redis 端口的问题2.2.1 端口转发?2.2.2 端口配置 2.3 连接到 Redis 服务器 三 . 通用命令3.1 set 和 get3.2 exists 和 del3.3 keys3.4 expire、ttl、type 三 . string 相关命令3.1 mse…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
