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

代码优化之简化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&#xff1a; #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 的全方位指南

前言 在人工智能的浪潮中&#xff0c;语音识别技术正逐渐成为我们日常生活中不可或缺的一部分。随着 OpenAI 的 Whisper 模型的推出&#xff0c;语音转文本的过程变得前所未有的简单和高效。无论是从 YouTube 视频中提取信息&#xff0c;还是将播客内容转化为文本&#xff0c;…...

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手机恢复出厂设置 &#xff0c; 或者 线刷 enchilada_22_K.52_210716_repack--HOS-10.0.11.zip &#xff1a; https://gitee.com/OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip OnePlus6Hydrogen_22…...

偷懒总结篇|贪心算法|动态规划|单调栈|图论

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

C语言初阶七:C语言操作符详解(1)

#1024程序员节|征文# 这篇文章是对之前文章中操作符的补充&#xff0c;可以看之前的文章&#xff1a;C语言初阶&#xff1a;六.算数操作_如何用编程表示除法-CSDN博客 C语言操作符是用于执行各种运算和操作的符号。包括算术操作符&#xff08;如、-、*、/、%&#xff09;&#…...

GO excelize 读取excel进行时间类型转换(自动转换)

GO excelize 读取excel进行时间类型转换&#xff08;自动转换&#xff09; 需求分析 需求&#xff1a;如何自动识别excel中的时间类型数据并转化成对应的 "Y-m-d H:i:s"类型数据。 分析&#xff1a;excelize在读取excel时&#xff0c;GetRows() 返回的都是字符串类…...

【算法与数据结构】二分查找思想

#1024程序员节&#xff5c;征文# 正文&#xff1a; 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止&#xff0c;其实有时候数据没有序…...

PHP PDO:安全、灵活的数据持久层解决方案

PHP PDO&#xff1a;安全、灵活的数据持久层解决方案 PHP PDO&#xff08;PHP Data Objects&#xff09;是一个轻量级的、具有兼容接口的数据持久层抽象层。它提供了一个统一的API来访问多种数据库系统&#xff0c;如MySQL、PostgreSQL、SQLite、Oracle等。PDO扩展在PHP 5.1.0…...

九、Linux实战案例:项目部署全流程深度解析

Linux实战案例&#xff1a;项目部署全流程深度解析 在当今信息技术领域&#xff0c;Linux服务器凭借其卓越的稳定性、安全性以及强大的性能表现&#xff0c;被广泛应用于各类项目部署场景之中。本文将全面深入地介绍如何将一个项目成功部署至Linux服务器的完整流程&#xff0c…...

GIS常见前端开发框架

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

Java | Leetcode Java题解之第506题相对名次

题目&#xff1a; 题解&#xff1a; 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定义 堆是一种特殊的二叉树&#xff0c;并且满足以下两个特性&#xff1a; &#xff08;1&#xff09;堆是一棵完全二叉树&#xff1b; &#xff08;2&#xff09;堆中任意一个节点元素值都小于等于&#xff08;或大于等于&#xff09;左…...

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双向链表的节点&#xff0c;而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下: 0:是个特殊值&#xff0c;表示都不压缩。这是Redis的默认值…...

Elasticsearch 与 Lucene 的区别和联系

Elasticsearch 与 Lucene 的区别和联系 Elasticsearch 与 Lucene 的区别和联系一、知识背景Elasticsearch 简介Lucene 简介 二、Elasticsearch 和 Lucene 的区别适用场景性能优势和劣势架构设计的异同点 三、Elasticsearch和Lucene的联系四、Elasticsearch和Lucene的应用案例及…...

OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用

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

【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据

【SAP Hana】X-DOC&#xff1a;数据仓库ETL如何抽取SAP中的CDS视图数据 1、无参CDS对应数据库视图2、有参CDS对应数据库表函数3、封装有参CDS为无参CDS&#xff0c;从而对应数据库视图 1、无参CDS对应数据库视图 select * from ZFCML_REP_V where mandt 300;2、有参CDS对应数…...

WPF的UpdateSourceTrigger属性

在WPF中&#xff0c;UpdateSourceTrigger属性用于控制数据绑定中何时将绑定目标&#xff08;通常是UI元素&#xff09;的值更新回绑定源&#xff08;通常是数据对象&#xff09;。这个属性有以下几个值&#xff1a; Default&#xff1a;这是默认值&#xff0c;对于不同的绑定目…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...