当前位置: 首页 > news >正文

深度剖析C++17中的std::optional:处理可能缺失值的利器

生成特定比例的图片.png

文章目录

    • 一、基本概念与设计理念
    • 二、构建与初始化
      • (一)默认构造
      • (二)值初始化
      • (三)使用`std::make_optional`
      • (四)使用`std::nullopt`
    • 三、访问值
      • (一)`value()`
      • (二)`value_or(T default_value)`
      • (三)使用解引用操作符`*`和`->`
    • 四、修改器
      • (一)`reset()`
      • (二)`emplace()`
      • (三)`operator=`
    • 五、观察器
      • (一)`has_value()`
      • (二)`operator bool()`
      • (三)`value_type`
    • 六、使用场景
      • (一)函数返回值
      • (二)容器元素
      • (三)避免空指针异常
    • 七、性能考虑
    • 八、总结

在C++17的标准库中, std::optional是一个极为实用的工具,它为处理可能缺失的值提供了一种安全、高效且直观的方式。在传统的C++编程里,处理可能不存在的值是一个棘手的问题,通常依赖于特殊标记值,比如指针设为 nullptr,整数设为 -1 ,或者浮点数设为 std::numeric_limits<T>::quiet_NaN()等。但这些方式容易引入潜在的错误,尤其是当特殊标记值与合法数据值冲突时,还会让代码逻辑变得复杂难读。 std::optional的出现,很好地解决了这些痛点。

一、基本概念与设计理念

std::optional是C++17引入的一个模板类,它的设计目的是清晰地表达一个值可能存在,也可能不存在的情况。从本质上来说,std::optional是一个包含了一个值或者什么都不包含的对象。它通过将值的存在性和值本身封装在一起,使得代码能够更明确地处理可能缺失值的场景,提升了代码的安全性和可读性。

例如,考虑一个从数据库中获取用户年龄的函数。在某些情况下,数据库中可能没有记录该用户的年龄信息。使用std::optional,可以这样编写代码:

#include <optional>// 假设这是从数据库获取年龄的函数
std::optional<int> getAgeFromDatabase(int userId) {// 这里模拟数据库查询逻辑,假设某些情况下没有年龄数据if (userId == 1) {return 30;} else {return std::nullopt;}
}int main() {auto age = getAgeFromDatabase(2);if (age.has_value()) {std::cout << "用户年龄是: " << age.value() << std::endl;} else {std::cout << "未找到该用户的年龄信息" << std::endl;}return 0;
}

在这个例子中,getAgeFromDatabase函数返回一个std::optional<int>,如果找到了年龄,就返回包含年龄值的std::optional;如果没找到,就返回std::nullopt,表示没有值。在main函数中,通过has_value方法检查是否有值,再进行相应的处理,逻辑非常清晰。

二、构建与初始化

(一)默认构造

std::optional可以进行默认构造,此时它处于空状态,即不包含任何值:

std::optional<int> opt1; // 空的std::optional

(二)值初始化

通过直接赋值的方式,可以将一个值初始化为std::optional

std::optional<std::string> opt2 = "Hello, optional";

(三)使用std::make_optional

std::make_optional是一个便捷的函数模板,用于创建std::optional对象。它会直接在内部构造值,避免了不必要的拷贝或移动操作,在性能上更有优势:

auto opt3 = std::make_optional<std::vector<int>>({1, 2, 3});

(四)使用std::nullopt

std::nullopt是一个特殊的常量,专门用于表示std::optional为空的状态。可以在初始化时显式使用它来表明std::optional不包含值:

std::optional<double> opt4 = std::nullopt;

三、访问值

(一)value()

value()方法用于获取std::optional中存储的值。但需要特别注意的是,如果std::optional为空,调用value()会抛出std::bad_optional_access异常。所以在调用value()之前,务必先使用has_value()方法检查std::optional是否包含值:

std::optional<int> opt = 42;
if (opt.has_value()) {int val = opt.value();std::cout << "值是: " << val << std::endl;
}

(二)value_or(T default_value)

value_or方法提供了一种更安全的取值方式。当std::optional包含值时,它返回该值;当std::optional为空时,它返回传入的默认值。这样就避免了因调用value()方法在空状态下抛出异常的风险:

std::optional<int> opt5;
int result = opt5.value_or(100); // result为100

(三)使用解引用操作符*->

std::optional重载了*->操作符,当std::optional包含值时,可以像使用普通指针一样访问值。*操作符返回值的引用,->操作符用于访问值内部的成员:

class MyClass {
public:void print() {std::cout << "这是MyClass的实例" << std::endl;}
};std::optional<MyClass> opt6;
opt6.emplace();
if (opt6) {opt6->print(); // 调用MyClass的print方法(*opt6).print(); // 与上面的效果相同
}

四、修改器

(一)reset()

reset()方法用于将std::optional设置为空状态,即移除其中存储的值。之后再调用has_value()方法会返回false

std::optional<int> opt7 = 42;
opt7.reset();
if (!opt7.has_value()) {std::cout << "opt7现在为空" << std::endl;
}

(二)emplace()

emplace()方法允许在std::optional内部直接构造值,而不需要先移除旧值再进行赋值。这在构造复杂对象时非常有用,可以避免不必要的构造和析构开销,提高效率:

std::optional<std::string> opt8;
opt8.emplace("新的值");

(三)operator=

可以使用赋值操作符=来修改std::optional的值。如果std::optional之前为空,赋值后会包含新值;如果之前有值,会先销毁旧值,再存储新值:

std::optional<int> opt9 = 10;
opt9 = 20;

五、观察器

(一)has_value()

has_value()方法是最常用的观察器之一,用于检查std::optional是否包含值。在访问std::optional中的值之前,通常会先调用这个方法进行检查:

std::optional<double> opt10;
if (opt10.has_value()) {std::cout << "opt10有值" << std::endl;
} else {std::cout << "opt10为空" << std::endl;
}

(二)operator bool()

std::optional重载了bool类型转换操作符,使得可以直接在条件语句中判断std::optional是否包含值。这种方式简洁明了,常用于简化代码逻辑:

std::optional<std::vector<int>> opt11 = {1, 2, 3};
if (opt11) {std::cout << "opt11包含一个非空的vector" << std::endl;
}

(三)value_type

value_typestd::optional的嵌套类型别名,用于获取存储值的类型。在一些需要使用类型信息的模板编程场景中非常有用:

std::optional<std::string> opt12;
using value_type = std::optional<std::string>::value_type;

六、使用场景

(一)函数返回值

在函数返回值可能缺失的情况下,std::optional能清晰地表达这种不确定性。比如在实现一个查找元素索引的函数时:

std::optional<size_t> findIndex(const std::vector<int>& vec, int target) {for (size_t i = 0; i < vec.size(); ++i) {if (vec[i] == target) {return i;}}return std::nullopt;
}

(二)容器元素

std::optional可以作为容器的元素,用于表示容器中可能存在缺失值的情况。例如,在一个记录学生成绩的std::vector中,某些学生可能缺考:

std::vector<std::optional<int>> scores(10);
scores[3] = 85; // 学生3的成绩

(三)避免空指针异常

在使用指针的场景中,std::optional可以替代指针来避免空指针异常。例如,在管理动态分配对象的生命周期时:

std::optional<std::unique_ptr<MyClass>> obj;
if (someCondition) {obj.emplace(std::make_unique<MyClass>());
}
if (obj) {obj->doSomething();
}

七、性能考虑

从性能角度来看,std::optional的实现是非常高效的。在大多数情况下,它的内存占用只比存储的值多一个布尔标志位,用于表示值是否存在。这意味着在空间复杂度上,std::optional的额外开销极小。

在时间复杂度方面,std::optional的构造和析构操作与普通对象的开销相当。emplace方法更是直接在内部构造值,避免了不必要的拷贝和移动操作,进一步提高了效率。不过,在频繁进行值的存在性检查和访问操作时,由于需要额外的条件判断,可能会对性能产生一定的影响。但总体而言,与传统的使用特殊标记值来处理可能缺失值的方式相比,std::optional在性能和安全性上都有显著的优势。

八、总结

std::optional是C++17标准库中一个极具价值的特性,它为C++开发者提供了一种强大的工具,用于处理可能缺失值的情况。通过清晰地表达值的存在性,std::optional使得代码更易于理解和维护,同时减少了因处理缺失值不当而引发的错误。无论是在函数返回值、容器元素,还是在避免空指针异常等场景中,std::optional都展现出了其独特的优势。在实际的C++17项目开发中,合理运用std::optional,能够显著提升代码的质量和可靠性。

相关文章:

深度剖析C++17中的std::optional:处理可能缺失值的利器

文章目录 一、基本概念与设计理念二、构建与初始化&#xff08;一&#xff09;默认构造&#xff08;二&#xff09;值初始化&#xff08;三&#xff09;使用std::make_optional&#xff08;四&#xff09;使用std::nullopt 三、访问值&#xff08;一&#xff09;value()&#x…...

【ArcGIS微课1000例】0141:提取多波段影像中的单个波段

文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…...

一分钟搭建promehteus+grafana+alertmanager监控平台

为什么要自己搭建一个监控平台 平时进行后端开发&#xff0c;特别是微服务的后端可开发&#xff0c;一定少不了对接监控平台&#xff0c;但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试&#xff0c;这里我使用docker-compose搭建了一个…...

Transfoemr的解码器(Decoder)与分词技术

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;解码器&#xff08;Decoder&#xff09;和分词技术是两个至关重要的概念。解码器是序列生成任务的核心组件&#xff0c;而分词则是将文本数据转换为可处理形式的基础步骤。 一、解码器&#xff08;Decoder&…...

LeetCode100之在排序数组中查找元素的第一个和最后一个位置(34)--Java

1.问题描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题 示例1 输入…...

数字人+展厅应用方案:开启全新沉浸式游览体验

随着人们生活质量的不断提升&#xff0c;对于美好体验的追求日益增长。在展厅展馆领域&#xff0c;传统的展示方式已难以满足大众日益多样化的需求。而通过将数字人与展厅进行深度结合&#xff0c;可以打造数字化、智能化新型展厅&#xff0c;不仅能提升展示效果&#xff0c;还…...

echo ‘export PATH=/usr/local/bin:$PATH‘ >> ~/.bashrc这个和直接添加到/etc/profile有什么区别

echo export PATH/usr/local/bin:$PATH >> ~/.bashrc 和直接添加到 /etc/profile 都是用于修改 PATH 环境变量&#xff0c;但它们适用的范围和效果有所不同&#xff1a; 1. 修改 ~/.bashrc 文件 作用范围&#xff1a;~/.bashrc 是针对当前用户的配置文件&#xff0c;它…...

kafka消费者详细介绍(超级详细)

文章目录 一、Kafka 消费者与消费者组1.1 Kafka 消费者&#xff08;Consumer&#xff09;概述1.1.1 消费者工作流程1.1.2 消费者的关键配置 1.2 Kafka 消费者组&#xff08;Consumer Group&#xff09;概述1.2.1 消费者组的工作原理1.2.2 消费者组的优点1.2.3 消费者组的再均衡…...

《剪映5.9官方安装包》免费自动生成字幕

&#xff08;避免失效建议存自己网盘后下载&#xff09;剪映5.9官方Win.Mac 链接&#xff1a;https://pan.xunlei.com/s/VOHc-Fg2XRlD50MueEaOOeW1A1?pwdawtt# 官方唯一的免费版&#xff0c;Win和Mac都有&#xff0c;此版本官方已下架&#xff0c;觉得有用可转存收藏&#xf…...

CAS是什么?ABA会带来什么影响?怎么解决ABA问题?

前言 在高并发开发中&#xff0c;CAS&#xff08;比较并交换&#xff09;是一种常用的无锁操作&#xff0c;因其高效性而被广泛应用。然而&#xff0c;实际工作中常会遇到ABA问题&#xff0c;导致数据更新异常或逻辑错误。理解CAS的原理及ABA问题的解决方法&#xff0c;有助于…...

智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力

摘要&#xff1a;随着全球化和数字化进程的加速&#xff0c;消费者需求日益呈现出碎片化和个性化的趋势&#xff0c;这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求&#xff0c;因此&#xff0c;物流企业必须积极引入大…...

方豆子(递归)

方豆子 思路&#xff1a;很典的一道递归题&#xff0c;但当时没想到怎么递归/(ㄒoㄒ)/~~。赛后看了大佬的讲解知道要将这个图形看成由四个小正方形组成的大正方形&#xff0c;递归参数可以设置成&#xff08;r1,c1,r2,c2,good)表示正方形的左上角坐标和右下角坐标以及当前这个正…...

Go语言入门指南(二): 数据类型

文章创作不易&#xff0c;麻烦大家点赞关注转发一键三连。 在上一篇文章&#xff0c;我们已经完成了开发环境的搭建&#xff0c;成功创建了第一个“Hello, World”程序&#xff0c;并且对变量的声明和初始化有了初步的认识。在这篇文章中&#xff0c;我们将主要介绍Go语言的数据…...

Django ORM解决Oracle表多主键的问题

现状 以Django 3.2为例 Django ORM 设计为默认使用单一主键&#xff08;通常是自增的 id 字段&#xff09;&#xff0c;这一选择主要基于以下核心原因&#xff1a; 简化ORM设计与操作 统一访问方式外键关联简化 避免歧义冲突 主键语义明确防止隐式依赖 性能与数据库兼容 索引…...

学习数据结构(2)空间复杂度+顺序表

1.空间复杂度 &#xff08;1&#xff09;概念 空间复杂度也是一个数学表达式&#xff0c;表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间&#xff0c;因为常规情况每个对象大小差异不会很大&#xff0c;所以空间复杂…...

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…...

从零推导线性回归:最小二乘法与梯度下降的数学原理

​ 欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 本文所有内容相关代码都可在以下仓库中找到&#xff1a; Github-MachineLearning 1 线性回归 1.1 什么是线性回归 线性回归是一种用来预测和分析数据之间关系的工具。它的核心思想是找到一条直…...

OpenSIPS-从安装部署开始认识一个组件

前期讲到了Kamailio&#xff0c;它是一个不错的开源SIP&#xff08;Session Initiation Protocol&#xff09;服务器&#xff0c;主要用于构建高效的VoIP&#xff08;Voice over IP&#xff09;平台以及即时通讯服务。但是在同根同源&#xff08;OpenSER&#xff09;的分支上&a…...

数据结构(树)

每一个节点包含&#xff1a;父节点地址 值 左子节点地址 右子节点地址 如果一个节点不含有&#xff1a;父节点地址或左子节点地址 右子节点地址就记为null 二叉树 度&#xff1a;每一个节点的子节点数量 二叉树中&#xff0c;任意节点的度<2 树的结构&#xff1a; 二叉查…...

[Dialog屏幕开发] 设置搜索帮助

阅读该篇文章之前&#xff0c;可先阅读下述资料 [Dialog屏幕开发] 屏幕绘制(使用向导创建Tabstrip Control标签条控件)https://blog.csdn.net/Hudas/article/details/145372195?spm1001.2014.3001.5501https://blog.csdn.net/Hudas/article/details/145372195?spm1001.2014.…...

C语言从入门到进阶

视频&#xff1a;https://www.bilibili.com/video/BV1Vm4y1r7jY?spm_id_from333.788.player.switch&vd_sourcec988f28ad9af37435316731758625407&p23 //枚举常量 enum Sex{MALE,FEMALE,SECRET };printf("%d\n", MALE);//0 printf("%d\n", FEMALE…...

Node.js下载安装及环境配置教程 (详细版)

Node.js&#xff1a;是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型&#xff0c;使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序&#xff0…...

Mac Electron 应用签名(signature)和公证(notarization)

在MacOS 10.14.5之后&#xff0c;如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核&#xff0c;来判断是否存在病毒)&#xff0c;那么就不能被安装。当然现在很多人的解决方案都是使用sudo spctl --master-disable&#xff0c;取消验证模式&#…...

redis安装 windows版本

下载 github下载5.x版本redis 安装以及启动 解压文件&#xff0c;目标如下 进入cmd至安装路径 执行如下命令启动redis redis-server.exe redis.windows.conf 进入redis,另外启动cmd在当前目录执行进入redis 服务 redis-cli 测试命令 至此安装成功&#xff0c;但是这只是…...

关联传播和 Python 和 Scikit-learn 实现

文章目录 一、说明二、什么是 Affinity Propagation。2.1 先说Affinity 传播的工作原理2.2 更多细节2.3 传播两种类型的消息2.4 计算责任和可用性的分数2.4.1 责任2.4.2 可用性分解2.4.3 更新分数&#xff1a;集群是如何形成的2.4.4 估计集群本身的数量。 三、亲和力传播的一些…...

若依基本使用及改造记录

若依框架想必大家都了解得不少&#xff0c;不可否认这是一款及其简便易用的框架。 在某种情况下&#xff08;比如私活&#xff09;使用起来可谓是快得一匹。 在这里小兵结合自身实际使用情况&#xff0c;记录一下我对若依框架的使用和改造情况。 一、源码下载 前往码云进行…...

c语言网 1127 尼科彻斯定理

原题 题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 ​ #include<ios…...

能说说MyBatis的工作原理吗?

大家好&#xff0c;我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助&#xff1b; 能说说MyBatis的工作原理吗&#xff1f; MyBatis 是一款流行的持久层框架&#xff0c;它通过简化数据库操作&#xff0c;帮助开发者更高效地与数据库进行交互。MyBatis…...

卡特兰数学习

1&#xff0c;概念 卡特兰数&#xff08;英语&#xff1a;Catalan number&#xff09;&#xff0c;又称卡塔兰数&#xff0c;明安图数。是组合数学中一种常出现于各种计数问题中的数列。它在不同的计数问题中频繁出现。 2&#xff0c;公式 卡特兰数的递推公式为&#xff1a;f(…...

【算法】多源 BFS

多源 BFS 1.矩阵距离2.刺杀大使 单源最短路问题 vs 多源最短路问题 当问题中只存在一个起点时&#xff0c;这时的最短路问题就是单源最短路问题。当问题中存在多个起点而不是单一起点时&#xff0c;这时的最短路问题就是多源最短路问题。 多源 BFS&#xff1a;多源最短路问题…...

解锁数字经济新动能:探寻 Web3 核心价值

随着科技的快速发展&#xff0c;我们正迈入一个全新的数字时代&#xff0c;Web3作为这一时代的核心构成之一&#xff0c;正在为全球数字经济带来革命性的变革。本文将探讨Web3的核心价值&#xff0c;并如何推动数字经济的新动能。 Web3是什么&#xff1f; Web3&#xff0c;通常…...

CAN总线数据采集与分析

CAN总线数据采集与分析 目录 CAN总线数据采集与分析1. 引言2. 数据采集2.1 数据采集简介2.2 数据采集实现 3. 数据分析3.1 数据分析简介3.2 数据分析实现 4. 数据可视化4.1 数据可视化简介4.2 数据可视化实现 5. 案例说明5.1 案例1&#xff1a;数据采集实现5.2 案例2&#xff1…...

appium自动化环境搭建

一、appium介绍 appium介绍 appium是一个开源工具、支持跨平台、用于自动化ios、安卓手机和windows桌面平台上面的原生、移动web和混合应用&#xff0c;支持多种编程语言(python&#xff0c;java&#xff0c;Ruby&#xff0c;Javascript、PHP等) 原生应用和混合应用&#xf…...

二叉树高频题目——下——不含树型dp

一&#xff0c;普通二叉树上寻找两个节点的最近的公共祖先 1&#xff0c;介绍 LCA&#xff08;Lowest Common Ancestor&#xff0c;最近公共祖先&#xff09;是二叉树中经常讨论的一个问题。给定二叉树中的两个节点&#xff0c;它的LCA是指这两个节点的最低&#xff08;最深&…...

Java并发学习:进程与线程的区别

进程的基本原理 一个进程是一个程序的一次启动和执行&#xff0c;是操作系统程序装入内存&#xff0c;给程序分配必要的系统资源&#xff0c;并且开始运行程序的指令。 同一个程序可以多次启动&#xff0c;对应多个进程&#xff0c;例如同一个浏览器打开多次。 一个进程由程…...

【ProxyBroker】用Python打破网络限制的利器

ProxyBroker 1. 什么是ProxyBroker2. ProxyBroker的功能3. ProxyBroker的优势4. ProxyBroker的使用方法5. ProxyBroker的应用场景6.结语项目地址&#xff1a; 1. 什么是ProxyBroker ProxyBroker是一个开源工具&#xff0c;它可以异步地从多个来源找到公共代理&#xff0c;并同…...

Gradle buildSrc模块详解:集中管理构建逻辑的利器

文章目录 buildSrc模块二 buildSrc的使命三 如何使用buildSrc1. 创建目录结构2. 配置buildSrc的构建脚本3. 编写共享逻辑4. 在模块中引用 四 典型使用场景1. 统一依赖版本管理2. 自定义Gradle任务 3. 封装通用插件4. 扩展Gradle API 五 注意事项六 与复合构建&#xff08;Compo…...

2025数学建模美赛|F题成品论文

国家安全政策与网络安全 摘要 随着互联网技术的迅猛发展&#xff0c;网络犯罪问题已成为全球网络安全中的重要研究课题&#xff0c;且网络犯罪的形式和影响日益复杂和严重。本文针对网络犯罪中的问题&#xff0c;基于多元回归分析和差异中的差异&#xff08;DiD&#xff09;思…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.10 文本数据炼金术:从CSV到结构化数组

1.10 《文本数据炼金术&#xff1a;从CSV到结构化数组》 目录 #mermaid-svg-TNkACjzvaSXnULaB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TNkACjzvaSXnULaB .error-icon{fill:#552222;}#mermaid-svg-TNkACjzva…...

「蓝桥杯题解」蜗牛(Java)

题目链接 这道题我感觉状态定义不太好想&#xff0c;需要一定的经验 import java.util.*; /*** 蜗牛* 状态定义&#xff1a;* dp[i][0]:到达(x[i],0)最小时间* dp[i][1]:到达 xi 上方的传送门最小时间*/public class Main {static Scanner in new Scanner(System.in);static f…...

基于springboot+vue的流浪动物救助系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

51单片机开发:IO扩展(串转并)实验

实验目标&#xff1a;通过扩展口从下至上依次点亮点阵屏的行。 下图左边是74HC595 模块电路图&#xff0c;右边是点阵屏电图图。 SRCLK上升沿时&#xff0c;将SER输入的数据移送至内部的移位寄存器。 RCLK上升沿时&#xff0c;将数据从移位寄存器移动至存储寄存器&#xff0c…...

JAVA实战开源项目:购物商城网站(Vue+SpringBoot) 附源码

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

C++学习——认识和与C的区别

目录 前言 一、什么是C 二、C关键字 三、与C语言不同的地方 3.1头文件 四、命名空间 4.1命名空间的概念写法 4.2命名空间的访问 4.3命名空间的嵌套 4.4命名空间在实际中的几种写法 五、输入输出 5.1cout 5.2endl 5.3cin 总结 前言 开启新的篇章&#xff0c;这里…...

Open FPV VTX开源之ardupilot双OSD配置摄像头

Open FPV VTX开源之ardupilot双OSD配置 1 源由2. 分析3. 配置4. 解决办法5. 参考资料 1 源由 鉴于笔者这台Mark4 Copter已经具备一定的历史&#xff0c;目前机载了两个FPV摄像头&#xff1a; 模拟摄像头数字摄像头(OpenIPC) 测试场景&#xff1a; 从稳定性的角度&#xff1…...

基于微信小程序高校课堂教学管理系统 课堂管理系统微信小程序(源码+文档)

目录 一.研究目的 二.需求分析 三.数据库设计 四.系统页面展示 五.免费源码获取 一.研究目的 困扰管理层的许多问题当中,高校课堂教学管理也是不敢忽视的一块。但是管理好高校课堂教学又面临很多麻烦需要解决,如何在工作琐碎,记录繁多的情况下将高校课堂教学的当前情况反…...

unity商店插件A* Pathfinding Project如何判断一个点是否在导航网格上?

需要使用NavGraph.IsPointOnNavmesh(Vector3 point) 如果点位于导航网的可步行部分&#xff0c;则为真。 如果一个点在可步行导航网表面之上或之下&#xff0c;在任何距离&#xff0c;如果它不在更近的不可步行节点之上 / 之下&#xff0c;则认为它在导航网上。 使用方法 Ast…...

三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗

三星手机的人脸识别解锁功能默认需要滑动或点击屏幕来解锁。这是为了增强安全性&#xff0c;防止误解锁的情况。如果希望在检测到人脸后直接进入主界面&#xff0c;可以通过以下设置调整&#xff1a; 打开设置&#xff1a; 进入三星手机的【设置】应用。 进入生物识别和安全&a…...

read+write实现:链表放到文件+文件数据放到链表 的功能

思路 一、 定义链表&#xff1a; 1 节点结构&#xff08;数据int型&#xff09; 2 链表操作&#xff08;创建节点、插入节点、释放链表、打印链表&#xff09;。 二、链表保存到文件 1打开文件 2遍历链表、写文件&#xff1a; 遍历链表,write()将节点数据写入文件。…...

猫怎么分公的母的?

各位铲屎官们&#xff0c;是不是刚领养了一只小猫咪&#xff0c;却分不清它是公是母&#xff1f;别急&#xff0c;今天就来给大家好好揭秘&#xff0c;如何轻松辨别猫咪的性别&#xff0c;让你不再为“它”是“他”还是“她”而烦恼&#xff01; 一、观察生殖器位置 最直接的方…...