代码优化之简化if臃肿的判断条件
简化if判断条件
方法1:
#include <iostream>
#include <vector>
#include <functional>// 封装参数的结构体
struct ConditionParams {int facenum;double zoomRatio;int iso;double facelv;int face_w;double qualityScore;int xx;int yy;
};// 条件检查函数,使用 std::function
bool checkConditions(const ConditionParams& params) {std::vector<std::pair<std::function<bool(const ConditionParams&)>, std::string>> conditions = {{[](const ConditionParams& p) { return p.facenum < p.xx; }, "Face number condition failed."},{[](const ConditionParams& p) { return p.zoomRatio > p.xx; }, "Zoom ratio condition failed."},{[](const ConditionParams& p) { return p.iso < p.xx && p.iso > p.yy; }, "ISO condition failed."},{[](const ConditionParams& p) { return p.facelv > p.xx; }, "Face level condition failed."},{[](const ConditionParams& p) { return p.face_w > p.xx; }, "Face width condition failed."},{[](const ConditionParams& p) { return p.qualityScore > p.xx; }, "Quality score condition failed."}};// 逐个检查条件for (const auto& [checker, errorMessage] : conditions) {if (!checker(params)) {std::cerr << errorMessage << std::endl;return false;}}return true;
}int main() {// 输入的参数ConditionParams params = {5, 2.0, 400, 1.5, 60, 0.95, 10, 100};// 检查条件if (checkConditions(params)) {std::cout << "All conditions met." << std::endl;} else {std::cout << "Some conditions failed." << std::endl;}return 0;
}
std::function
:使用std::function<bool(const ConditionParams&)>
取代了函数指针,使得 lambda 表达式更加灵活。ConditionParams
结构体:将所有条件判断的输入参数封装在ConditionParams
结构体中,使得代码简洁且易于扩展。- 简洁的条件检查流程:通过
for
循环遍历所有条件并逐个检查,每个条件不满足时打印对应的错误信息,便于调试。
方法2:
- 将每个条件提取到独立的函数中:这样每个条件的逻辑更加清晰。
- 提供清晰的日志或调试信息:当某个条件未通过时,可以打印出相关的错误或状态信息。
- 使用可读性更好的结构:比如,链式调用或结构体方式,使条件检查更具语义化。
#include <iostream>bool checkFaceNum(int facenum, int threshold) {if (facenum < threshold) {std::cout << "Check failed: facenum < " << threshold << std::endl;return false;}return true;
}bool checkZoomRatio(float zoomRatio, float threshold) {if (zoomRatio <= threshold) {std::cout << "Check failed: zoomRatio <= " << threshold << std::endl;return false;}return true;
}bool checkIsoRange(int iso, int minThreshold, int maxThreshold) {if (iso < minThreshold || iso > maxThreshold) {std::cout << "Check failed: iso out of range [" << minThreshold << ", " << maxThreshold << "]" << std::endl;return false;}return true;
}bool checkFaceLevel(float facelv, float threshold) {if (facelv <= threshold) {std::cout << "Check failed: facelv <= " << threshold << std::endl;return false;}return true;
}bool checkFaceWidth(float face_w, float threshold) {if (face_w <= threshold) {std::cout << "Check failed: face_w <= " << threshold << std::endl;return false;}return true;
}bool checkQualityScore(float qualityScore, float threshold) {if (qualityScore <= threshold) {std::cout << "Check failed: qualityScore <= " << threshold << std::endl;return false;}return true;
}bool allConditionsMet(int facenum, float zoomRatio, int iso, float facelv, float face_w, float qualityScore) {return checkFaceNum(facenum, 10) && // 假设阈值为 10checkZoomRatio(zoomRatio, 1.5) && // 假设阈值为 1.5checkIsoRange(iso, 100, 800) && // 假设iso范围为100-800checkFaceLevel(facelv, 0.8) && // 假设facelv阈值为 0.8checkFaceWidth(face_w, 50) && // 假设face_w阈值为 50checkQualityScore(qualityScore, 0.9); // 假设质量分数阈值为 0.9
}int main() {int facenum = 9;float zoomRatio = 2.0;int iso = 400;float facelv = 1.0;float face_w = 55.0;float qualityScore = 0.95;if (allConditionsMet(facenum, zoomRatio, iso, facelv, face_w, qualityScore)) {std::cout << "All conditions met, proceeding..." << std::endl;} else {std::cout << "Conditions not met, please check the logs for details." << std::endl;}return 0;
}
方法3:
如果条件很多,可以使用结构体封装输入参数,并通过链式方法实现条件检查。
#include <iostream>struct ConditionChecker {int facenum;float zoomRatio;int iso;float facelv;float face_w;float qualityScore;bool checkFaceNum(int threshold) {if (facenum < threshold) {std::cout << "Check failed: facenum < " << threshold << std::endl;return false;}return true;}bool checkZoomRatio(float threshold) {if (zoomRatio <= threshold) {std::cout << "Check failed: zoomRatio <= " << threshold << std::endl;return false;}return true;}bool checkIsoRange(int minThreshold, int maxThreshold) {if (iso < minThreshold || iso > maxThreshold) {std::cout << "Check failed: iso out of range [" << minThreshold << ", " << maxThreshold << "]" << std::endl;return false;}return true;}bool checkFaceLevel(float threshold) {if (facelv <= threshold) {std::cout << "Check failed: facelv <= " << threshold << std::endl;return false;}return true;}bool checkFaceWidth(float threshold) {if (face_w <= threshold) {std::cout << "Check failed: face_w <= " << threshold << std::endl;return false;}return true;}bool checkQualityScore(float threshold) {if (qualityScore <= threshold) {std::cout << "Check failed: qualityScore <= " << threshold << std::endl;return false;}return true;}// 链式条件检查bool allConditionsMet() {return checkFaceNum(10) &&checkZoomRatio(1.5) &&checkIsoRange(100, 800) &&checkFaceLevel(0.8) &&checkFaceWidth(50) &&checkQualityScore(0.9);}
};int main() {ConditionChecker checker = {9, 2.0, 400, 1.0, 55.0, 0.95};if (checker.allConditionsMet()) {std::cout << "All conditions met, proceeding..." << std::endl;} else {std::cout << "Conditions not met, please check the logs for details." << std::endl;}return 0;
}
相关文章:
代码优化之简化if臃肿的判断条件
简化if判断条件 方法1: #include <iostream> #include <vector> #include <functional>// 封装参数的结构体 struct ConditionParams {int facenum;double zoomRatio;int iso;double facelv;int face_w;double qualityScore;int xx;int yy; };//…...

【OpenAI】第六节(语音生成与语音识别技术)从 ChatGPT 到 Whisper 的全方位指南
前言 在人工智能的浪潮中,语音识别技术正逐渐成为我们日常生活中不可或缺的一部分。随着 OpenAI 的 Whisper 模型的推出,语音转文本的过程变得前所未有的简单和高效。无论是从 YouTube 视频中提取信息,还是将播客内容转化为文本,…...
Docker 下备份恢复oracle
1.docker导出容器镜像 ##docker save -o 导出后的镜像名称.tar 容器名称|镜像id docker save -o oracle_11g.tar 3fa112fd3642 2.下载镜像上传镜像略 3.加载镜像 ##docker load -i <archive_file> docker load -i oracle11g11201.tar 4.添加版本号…...
oneplus3t-android_framework
0.确认oneplus6 root正常 oneplus6 root材料 oneplus6手机恢复出厂设置 , 或者 线刷 enchilada_22_K.52_210716_repack--HOS-10.0.11.zip : https://gitee.com/OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip OnePlus6Hydrogen_22…...

偷懒总结篇|贪心算法|动态规划|单调栈|图论
由于这周来不及了,先过一遍后面的思路,具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙,拆分利润) 把利润分解为每天为单位的维度,需要收集每天的正利润就可以,收集正利润的区间…...

C语言初阶七:C语言操作符详解(1)
#1024程序员节|征文# 这篇文章是对之前文章中操作符的补充,可以看之前的文章:C语言初阶:六.算数操作_如何用编程表示除法-CSDN博客 C语言操作符是用于执行各种运算和操作的符号。包括算术操作符(如、-、*、/、%)&#…...
GO excelize 读取excel进行时间类型转换(自动转换)
GO excelize 读取excel进行时间类型转换(自动转换) 需求分析 需求:如何自动识别excel中的时间类型数据并转化成对应的 "Y-m-d H:i:s"类型数据。 分析:excelize在读取excel时,GetRows() 返回的都是字符串类…...

【算法与数据结构】二分查找思想
#1024程序员节|征文# 正文: 二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止,其实有时候数据没有序…...
PHP PDO:安全、灵活的数据持久层解决方案
PHP PDO:安全、灵活的数据持久层解决方案 PHP PDO(PHP Data Objects)是一个轻量级的、具有兼容接口的数据持久层抽象层。它提供了一个统一的API来访问多种数据库系统,如MySQL、PostgreSQL、SQLite、Oracle等。PDO扩展在PHP 5.1.0…...
九、Linux实战案例:项目部署全流程深度解析
Linux实战案例:项目部署全流程深度解析 在当今信息技术领域,Linux服务器凭借其卓越的稳定性、安全性以及强大的性能表现,被广泛应用于各类项目部署场景之中。本文将全面深入地介绍如何将一个项目成功部署至Linux服务器的完整流程,…...

GIS常见前端开发框架
#1024程序员节|征文# 伴随GIS的发展,陆续出现了众多开源地图框架,这些地图框架与众多行业应用融合,极大地拓展了GIS的生命力,这里介绍几个常见的GIS前端开发框架,排名不分先后。 1.Leaflet https://leafl…...

Java | Leetcode Java题解之第506题相对名次
题目: 题解: class Solution {public String[] findRelativeRanks(int[] score) {int n score.length;String[] desc {"Gold Medal", "Silver Medal", "Bronze Medal"};int[][] arr new int[n][2];for (int i 0; i &…...

数据结构 - 堆
今天我们将学习新的数据结构-堆。 01定义 堆是一种特殊的二叉树,并且满足以下两个特性: (1)堆是一棵完全二叉树; (2)堆中任意一个节点元素值都小于等于(或大于等于)左…...

html----图片按钮,商品展示
源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图标</title><style>.box{width:…...
YOLOv11改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
一、本文介绍 本文记录的是利用小波卷积WTConv模块优化YOLOv11的目标检测网络模型。WTConv的目的是在不出现过参数化的情况下有效地增加卷积的感受野,从而解决了CNN在感受野扩展中的参数膨胀问题。本文将其加入到深度可分离卷积中,有效降低模型参数量和计算量,并二次创新C3…...
redis高级篇之redis源码分析List类型quicklist底层演变 答疑159节
(1)ziplist压缩配置:list-compress-depth 0 表示一个quicklist两端不被压缩的节点个数。这里的节点是指quicklist双向链表的节点,而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下: 0:是个特殊值,表示都不压缩。这是Redis的默认值…...
Elasticsearch 与 Lucene 的区别和联系
Elasticsearch 与 Lucene 的区别和联系 Elasticsearch 与 Lucene 的区别和联系一、知识背景Elasticsearch 简介Lucene 简介 二、Elasticsearch 和 Lucene 的区别适用场景性能优势和劣势架构设计的异同点 三、Elasticsearch和Lucene的联系四、Elasticsearch和Lucene的应用案例及…...

OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 基于高斯混合模型的背景/前景分割算法。 该类实现了在文献[320]和[319]中描述的高斯混合模型背景减除。 cv::BackgroundSubtractorMOG2 类是 O…...

【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据
【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据 1、无参CDS对应数据库视图2、有参CDS对应数据库表函数3、封装有参CDS为无参CDS,从而对应数据库视图 1、无参CDS对应数据库视图 select * from ZFCML_REP_V where mandt 300;2、有参CDS对应数…...
WPF的UpdateSourceTrigger属性
在WPF中,UpdateSourceTrigger属性用于控制数据绑定中何时将绑定目标(通常是UI元素)的值更新回绑定源(通常是数据对象)。这个属性有以下几个值: Default:这是默认值,对于不同的绑定目…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...