代码优化之简化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:这是默认值,对于不同的绑定目…...
 
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
 
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
 
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
 
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
 
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
 
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
 
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
