C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any、如何让C++及字符串运行得更快
b站Cherno的课[76]-[80]
- 一、如何处理OPTIONAL数据 std::optional
- 二、单一变量存放多类型的数据 std::variant
- 三、如何存储任意类型的数据 std::any
- 四、如何让C++运行得更快
- 五、如何让C++字符串更快
一、如何处理OPTIONAL数据 std::optional
std::optional C++17
数据是否存在是可选的
#include <iostream>
#include <fstream>
#include <optional>std::optional<std::string> ReadFileAsString(const std::string& filepath)
{std::ifstream stream(filepath);if (stream){std::string result;// read filestream.close();return result;}return {};
}int main()
{std::optional<std::string> data = ReadFileAsString("data.txt");if (data.has_value()){std::cout << "File read successfully!\n";}else{std::cout << "File could not be opened\n";}std::cin.get();
}



#include
std::optional function(param){statement; return type;}
auto result = function();
1: result.has_value()判断数据是否存在, 通过result.value()获取数据
2: result.value_or(xxx)其中xxx作为默认值,如果存在数据返回数据,不存在返回xxx
3:通过if (result)判断数据是否存在
注: 使用场景—目标值可能存在也可能不存在,比如读取文件并返回内容,可能读取成功有数据,读取成功无数据,读取不成功。
二、单一变量存放多类型的数据 std::variant
C++17的特性
C++17新的标准库给我们的类
std::variant
variant本质上就像类型安全的联合体union
#include <iostream>
#include <variant>int main()
{std::variant<std::string, int> data;std::cout << sizeof(int) << "\n";std::cout << sizeof(std::string) << "\n";std::cout << sizeof(data) << "\n";data = "wm";std::cout << std::get<std::string>(data) << "\n";//data.index();// 0if (auto* value = std::get_if<std::string>(&data)){std::string& v = *value;}else{}data = 2;std::cout << std::get<std::string>(data) << "\n";std::cout << std::get<int>(data) << "\n";std::cin.get();
}

它是为你创建了一个结构体或类。
它只是将这两种数据类型存储为那个类或结构体中的成员
std::variant(C++17引入)和传统的union(C语言继承的特性)都用于存储不同类型的值,但它们在设计、安全性和功能上有显著差异。
从技术上讲,union仍然是更有效率和更好的
然而,variant更加类型安全,不会造成未定义行为,你应该使用它,
除非你做的是底层优化,把内存大小保持在一个较低的位置,不管是什么原因,比如CPU处理
或者只是因为你想使用尽可能少的内存
但是,如果您是在桌面平台上,您可以自由地使用更多的内存
和更多的处理能力,那么std::variant在技术上更安全


#include
std::variant<type1, type2> data;
data = type1(xxx)
类似于union,type1与type2表示存储的数据类型。
读取:
1: std::get(data)
2: auto *value = std::get_if(type)(&data)
注:类型安全

三、如何存储任意类型的数据 std::any
void指针
std::any
variant和any的区别
variant需要你列出类型
这和它们的存储方式有关,variant只是一个类型安全的union,
意思是它把所有的数据都存储在一个union里
small types 小类型
它只是把它们存储为一个Union,这意味着对于小类型small type来说,
它的工作方式与variant完全相同
如果你有一个大的类型,它会带你进入大存储空间的void*,
在这种情况下,它会动态分配内存
动态分配内存不利于性能
总结一下这是如何工作的,如果你在小型类型上使用variant或any。
比如int,float。比如一个用于类的vector或类似的东西
比如math库等等,都没问题
它们会以完全相同的方式工作
如果你需要更多的存储空间,std::any会动态分配,
但是std::variant不会
所以换句话说,除了更加类型安全和有一点限制性(这是一件好事)之外,std::variant在处理较大数据时也会执行得更快,而这些数据又需要避免动态内存分配
四、如何让C++运行得更快
如何通过多线程提高性能
C++11的引入 std::asnyc futures
五、如何让C++字符串更快
#include <iostream>
#include <string>static uint32_t s_AllocCount = 0;void* operator new(size_t size)
{s_AllocCount++;std::cout << "Allocating " << size << "bytes\n";return malloc(size);
}void PrintName(const std::string& name)
{std::cout << name << std::endl;
}int main()
{std::string name = "Yan Chernikov";PrintName(name);std::cout << s_AllocCount << " allocations" << std::endl;std::cin.get();
}

#include <iostream>
#include <string>static uint32_t s_AllocCount = 0;void* operator new(size_t size)
{s_AllocCount++;std::cout << "Allocating " << size << "bytes\n";return malloc(size);
}void PrintName(const std::string& name)
{std::cout << name << std::endl;
}int main()
{std::string name = "Yan Chernikov";std::string firstName = name.substr(0, 3);std::string lastName = name.substr(4, 9);PrintName(firstName);std::cout << s_AllocCount << " allocations" << std::endl;std::cin.get();
}

有一种很简单的方法,可以修改现有代码,将分配减少到一个
最后我们会删除所有这些分配,也就是0个分配
当你在优化的时候,只要看看这个程序,你只需要看看你在做什么,因为在很多情况下,只要看看数据你就能找到优化它的方法
换句话说,我在创建一个窗口,一个进入现有内存的小视图,
而不是分配一个新的字符串,用substrO创建一个新的字符串
我不需要这些,因为我想要的只是一个窗口的视图,到一个已有的、有自己内存的字符串
视图:一种不复制的数据窗口
尽量不使用string使用const char*或string_views
相关文章:
C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any、如何让C++及字符串运行得更快
b站Cherno的课[76]-[80] 一、如何处理OPTIONAL数据 std::optional二、单一变量存放多类型的数据 std::variant三、如何存储任意类型的数据 std::any四、如何让C运行得更快五、如何让C字符串更快 一、如何处理OPTIONAL数据 std::optional std::optional C17 数据是否存在是可选…...
【信息系统项目管理师】高分论文:论信息系统项目的整合管理(旅游景区导游管理平台)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、制定项目章程二、制订项目管理计划三、指导和管理项目工作四、管理项目知识五、监控项目工作六、实施整体变更控制七、结束项目或阶段论文 在国家《中国旅游“十三五”发展规划信息化专项规划的背景下…...
【项目日记(一)】-仿mudou库one thread oneloop式并发服务器实现
1、模型框架 客户端处理思想:事件驱动模式 事件驱动处理模式:谁触发了我就去处理谁。 ( 如何知道触发了)技术支撑点:I/O的多路复用 (多路转接技术) 1、单Reactor单线程:在单个线程…...
[特殊字符] LoRA微调大模型实践:从MAC到Web的全流程指南
🚀 实践步骤概览 今天我们要在MAC上完成一个完整的AI项目闭环: 微调一个大模型 → 2. 导出模型并部署 → 3. 暴露API给web后端 → 4. 前端展示 🛠️ 微调模型准备 核心配置 框架:LLama-Factory 🏭 算法:…...
关于 Spring Boot 监控方式的详细对比说明及总结表格
以下是关于 Spring Boot 监控方式的详细对比说明及总结表格: 1. 监控方式概述 1.1 Actuator(内置核心监控) 功能: Spring Boot 内置的监控模块,提供健康检查、指标收集、环境信息、HTTP 追踪等端点。 适用场景&#…...
OpenCV 图形API(35)图像滤波-----中值模糊函数medianBlur()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用中值滤波器模糊图像。 该函数使用带有 ksizeksize 开口的中值滤波器来平滑图像。多通道图像的每个通道都是独立处理的。输出图像必须与输入…...
【嵌入式八股5】C++:多线程相关
1. 线程创建与管理 1.1 pthread_create 功能: 创建一个新的线程,并指定该线程的执行函数。参数: pthread_t *thread: 指向线程标识符的指针。const pthread_attr_t *attr: 线程属性,通常为 NULL。void *(*start_routine)(void *): 线程执行的函数指针。…...
视觉slam框架从理论到实践-第一节绪论
从opencv的基础实现学习完毕后,接下来依照视觉slam框架从理论到实践(第二版)的路线进行学习,主要以学习笔记的形式进行要点记录。 目录 1.数据里程计 2.后端优化 3.回环检测 4.建图 在视觉SLAM 中整体作业流程可分为࿱…...
图论--DFS搜索图/树
目录 一、图的存储结构 二、题目练习 846. 树的重心 - AcWing题 dfs,之前学习的回溯算法好多都是用dfs实现搜索的(把题目抽象成树形结构来搜索),其实 回溯算法就是 深搜,只不过针对某一搜索场景 我们给他一个更细分…...
Visual Studio + OpenCV C++ 安装与配置教程
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛用于图像处理、视频分析、模式识别和机器学习等领域。它由Intel公司于1999年发起,并在2000年由Willow Garage(一个机器人研究机构)进一步开发和维护。OpenCV支持多种编程语言,包括C++、Python…...
Java核心知识点的系统整理(一)
目录 一、数据类型与运算符秘籍 1. 四类八种数据类型 2. 自增运算符的暗战 3. 位运算与逻辑运算对决 二、流程控制三剑客 1. 分支结构抉择 2. 循环控制四骑士 三、面向对象核心机制 1. final的三重封印 2. 静态成员生存法则 四、进阶特性解密 1. 多态的三重境界 2…...
在Android Studio中,`Settings`里的Gradle路径、环境变量以及`gradle - wrapper.properties`文件关联
在Android Studio中,Settings里的Gradle路径、环境变量以及gradle - wrapper.properties文件关联 Android Studio中Settings里的Gradle路径 在Android Studio的Settings(Preferences ) -> Build, Execution, Deployment -> Build Tools -> Gradle 中: Use defau…...
算法复习(二分+离散化+快速排序+归并排序+树状数组)
一、二分算法 二分算法,堪称算法世界中的高效查找利器,其核心思想在于利用数据的有序性,通过不断将查找区间减半,快速定位目标元素或满足特定条件的位置。 1. 普通二分 普通二分适用于在有序数组中查找特定元素的位置。我们可以…...
VSCode写java时常用的快捷键
首先得先安好java插件 1、获取返回值 这里是和idea一样的快捷键的,都是xxxx.var 比如现在我new一个对象 就输入 new MbDo().var // 点击回车即可变成下面的// MbDo mbDo new MbDo()//以此类推get方法也可获取 mbDo.getMc().var // 点击回车即可变成下面的 // St…...
【Code】《代码整洁之道》笔记-Chapter16-重构SerialDate
第16章 重构SerialDate 如果你找到JCommon类库,深入该类库,其中有个名为org.jfree.date的程序包。在该程序包中,有个名为SerialDate的类,我们即将剖析这个类。 SerialDate的作者是David Gilbert。David显然是一位经验丰富、能力…...
使用 Node.js、Express 和 React 构建强大的 API
了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始,到集成 React 前端,并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者,这篇文章都适合你。 今天&#…...
深度学习入门:神经网络的学习
目录 1 从数据中学习1.1 数据驱动1.2 训练数据和测试数据 2损失函数2.1 均方误差2.2 交叉熵误差2.3 mini-batch学习2.4 mini-batch版交叉熵误差的实现2.5 为何要设定损失函数 3 数值微分3.1 数值微分3.3 偏导数 4 梯度4.1 梯度法4.2 神经网络的梯度 5 学习算法的实现5.1 2层神经…...
OSI参考模型和TCP/IP模型
1.OSI参考模型 OSI模型: OSI参考模型有7层,自下而上依次为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。(记忆口诀:物联网叔会用)。低…...
人工智能中的卷积神经网络(CNN)综述
文章目录 前言 1. CNN的基本原理 1.1 卷积层 1.2 池化层 1.3 全连接层 2. CNN的发展历程 2.1 LeNet-5 2.2 AlexNet 2.3 VGGNet 2.4 ResNet 3. CNN的主要应用 3.1 图像分类 3.2 目标检测 3.3 语义分割 3.4 自然语言处理 4. 未来研究方向 4.1 模型压缩与加速 4.2 自监督学习 4.3 …...
WordPress - 此站点出现严重错误
本篇讲 当WordPress出现 此站点出现严重错误 时,该如何解决。 目录 1,现象 2, FAQ 3,管理Menu无法打开 下面是详细内容。 1,现象 此站点出现严重错误(このサイトで重大なエラーが発生しました&#x…...
力扣每日打卡 1534. 统计好三元组 (简单)
力扣 1534. 统计好三元组 简单 前言一、题目内容二、解题方法1. 暴力解法2.官方题解2.1 方法一:枚举2.2 方法二:枚举优化 前言 这是刷算法题的第十二天,用到的语言是JS 题目:力扣 1534. 统计好三元组 (简单) 一、题目内容 给你一…...
《Vue3学习手记2》
今天主要学习Vue3中的数据监视: ps: 代码中的注释写的很详细,这样更有利于理解 watch 作用: 监视数据的变化(和Vue2中watch作用一致) 特点: Vue3中的watch只能监视以下四种数据: ref创建定义的数据(基本类型、对象类型)reactiv…...
在pycharm中搭建yolo11分类检测系统1--PyQt5学习(一)
实验条件:pycharm24.3autodlyolov11环境PyQt5 如果pycharm还没有配PyQt5的话就先去看我原先写的这篇博文: PyQT5安装搭配QT DesignerPycharm)-CSDN博客 跟练参考文章: 目标检测系列(四)利用pyqt5实现yo…...
【经验记录贴】使用配置文件提高项目的可维护性
mark一下。 整体修改前后如下: 课题: 在项目中有一个支持的文件类型的FILE_TYPE的定义, 这个是写死在主程序中,每次增加可以支持的文件类型的时候,都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...
从JSON到SQL:基于业务场景的SQL生成器实战
引言 在数据驱动的业务场景中,将业务需求快速转化为SQL查询是常见需求。本文将通过一个轻量级的sql_json_to_sql函数,展示如何将JSON格式的查询描述转换为标准SQL语句,并结合实际业务场景验证其功能。 核心代码解析 1. 代码实现 def sql_j…...
空格键会提交表单吗?HTML与JavaScript中的行为解析
在网页开发中,理解用户交互细节对于提供流畅的用户体验至关重要。一个常见的问题是:空格键是否会触发表单提交?本文将通过一个简单的示例解释这一行为,并探讨如何使用HTML和JavaScript来定制这种交互。 示例概览 考虑以下HTML代…...
06 - 多线程-JUC并发编程-原子类(二)
上一章,讲解java (java.util.concurrent.atomic) 包中的 支持基本数据类型的原子类,以及支持数组类型的原子类,这一章继续讲解支持对实体类的原子类,以及原子类型的修改器。 还有最后java (java…...
vue3 实现谷歌登录
很多人都是直接在 index.html 文件中引入的,刚开始我也那样写但是谷歌的api只能调起一次后续就不会生效了 我的登录是个弹窗,写在app.vue 文件中 const isGoogleLoaded ref(true);onMounted(async () > {initialize(); }); // 初始化 const initi…...
SOME/IP中”客户端消费“及”服务端提供”的解析
先上结论 AREthAddConsumedEventGroup-->客户端的函数-->谁调用 Consumed函数,谁就是消费者 AREthAddProvidedEventGroup-->服务端的函数-->谁调用 Provided函数,谁就是服务端 Server 端:AREthAddProvidedEventGroup → 声明 &…...
GO语言入门:字符串处理1(打印与格式化输出)
13.1 打印文本 在 fmt 包中,Print 函数用于打印(输出)文本信息。依据输出目标的不同,Print 函数可以划分为三组,详见下表。 按应用目标分组函数说明将文本信息输出到标准输出流,一般是输出到屏幕上Print将…...
