【C++】简约与清晰的编程艺术
C++编程的艺术:简约与清晰的实践之道
- 一、基础之美:基本类型与数据结构的力量
- 二、函数与库类的艺术
- 三、简约与清晰的实践之道
在C++这一既古老又充满活力的编程语言世界里,程序员们常常面临着一个重要的选择:是追求代码的极致抽象与封装,还是坚守简约与清晰的编程原则?实际上,这两者并非水火不容,而是相辅相成。特别是在处理日常程序设计工作时,一个常常被忽视但极其重要的观点是:“许多程序设计工作能够仅通过基本类型、数据结构、普通函数和若干库类完成,这样做既简单又清晰。设计到定义新类型的全套装备应尽量不用,除非在确实需要它们的地方。”这一观点不仅体现了编程的哲学,更是提高代码质量、降低维护成本的关键。
一、基础之美:基本类型与数据结构的力量
在C++的广阔天地中,基本类型(如int、float、char等)和标准数据结构(如数组、vector、map等)构成了编程的基石。它们之所以重要,是因为它们简单、直接,且能够满足大多数基本的编程需求。
实例一:基本类型的应用
考虑一个简单的场景,我们需要计算一个班级中所有学生的平均成绩。这里,我们可以直接使用基本类型来存储学生的成绩,并通过简单的算术运算来计算平均值。
cpp#include <iostream>
#include <vector>double calculateAverage(const std::vector<int>& scores) {int sum = 0;for (int score : scores) {sum += score;}return static_cast<double>(sum) / scores.size();
}int main() {std::vector<int> scores = {90, 85, 92, 78, 88};std::cout << "The average score is: " << calculateAverage(scores) << std::endl;return 0;
}
在这个例子中,我们使用了int类型来存储成绩,vector作为数据容器,以及基本的算术运算来计算平均值。这样的代码简洁明了,易于理解和维护。
实例二:数据结构的妙用
当需要处理更复杂的数据时,标准数据结构就显得尤为重要。比如,我们需要统计一个班级中每个分数段的学生人数,可以使用map来实现。
cpp#include <iostream>
#include <map>
#include <vector>void countScoreRanges(const std::vector<int>& scores, std::map<std::string, int>& ranges) {for (int score : scores) {if (score >= 90) ranges["A++"]++;else if (score >= 80) ranges["A"]++;else if (score >= 70) ranges["B"]++;else if (score >= 60) ranges["C"]++;else ranges["D/F"]++;}
}int main() {std::vector<int> scores = {90, 85, 78, 65, 52, 92, 88, 75};std::map<std::string, int> ranges;countScoreRanges(scores, ranges);for (const auto& range : ranges) {std::cout << range.first << ": " << range.second << std::endl;}return 0;
}
在这个例子中,我们使用了map<string, int>来统计不同分数段的学生人数。这种数据结构的选择使得代码更加清晰,易于扩展和维护。
二、函数与库类的艺术
除了基本类型和数据结构外,函数和库类也是C++编程中不可或缺的元素。它们提供了代码复用和模块化的手段,使得我们能够构建出更加复杂、功能更加丰富的程序。
函数的力量
函数是C++中实现代码复用的基本单元。通过定义函数,我们可以将特定的功能封装起来,然后在需要的地方调用它。这样做不仅可以减少代码冗余,还可以提高代码的可读性和可维护性。
实例三:函数的应用
假设我们需要实现一个功能,用于判断一个整数是否为素数。我们可以定义一个函数来完成这个任务。
cpp#include <iostream>
#include <cmath>bool isPrime(int n) {if (n <= 1) return false;for (int i = 2; i <= std::sqrt(n); ++i) {if (n % i == 0) return false;}return true;
}int main() {int num = 17;if (isPrime(num)) {std::cout << num << " is a prime number." << std::endl;} else {std::cout << num << " is not a prime number." << std::endl;}return 0;
}
在这个例子中,isPrime函数封装了判断素数的逻辑,使得我们可以在任何需要判断素数的地方调用它,而无需重复编写相同的代码。
库类的便捷
C++标准库和第三方库提供了大量的类,这些类封装了丰富的功能和算法,能够极大地简化编程工作。比如,我们可以使用std::string类来处理字符串,使用std::vector类来管理动态数组,使用std::algorithm中的算法函数来进行排序、查找等操作。
三、简约与清晰的实践之道
在C++编程中,追求简约与清晰是一种重要的实践之道。它要求我们在编写代码时,尽量使用基础元素(如基本类型、数据结构、函数和库类)来完成任务,避免不必要的复杂性和冗余性。
然而,这并不意味着我们应该完全摒弃定义新类型的做法。在某些情况下,定义新类型(如类、结构体等)是必要的,因为它们能够提供更高级别的抽象和封装,使得代码更加模块化和易于管理。但是,在定义新类型之前,我们应该仔细考虑是否真的需要它们,以及它们是否能够带来足够的好处来抵消可能带来的复杂性。
*总之,简约与清晰是C++编程中应该追求的重要目标。*通过合理使用基础元素和库类,我们可以编写出既高效又易于维护的代码。同时,在需要定义新类型时,我们也应该保持谨慎和理性,确保它们能够真正提高代码的质量和可维护性。
相关文章:
【C++】简约与清晰的编程艺术
C编程的艺术:简约与清晰的实践之道 一、基础之美:基本类型与数据结构的力量二、函数与库类的艺术三、简约与清晰的实践之道 在C这一既古老又充满活力的编程语言世界里,程序员们常常面临着一个重要的选择:是追求代码的极致抽象与封…...
java之WIFI信号模块
开发步骤分为以下几点: 1.在 AndroidManifest 中声明相关权限(网络和文件读写权限) 声明权限: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name"android.…...
Mybatis面试
Mybatis 面试 1、Mybatis 的执行流程是什么? 1、读取MyBatis配置文件:mybatis-config.xml 加载运行环境 和 映射文件 2、构造会话工厂 SqlSessionFactory (全局只有一个) 3、会话工厂创建SqlSession对象(项目与数据…...
Centos 8系统xfs文件系统类型进行扩容缩容 (LVM)
Centos 8系统xfs文件系统类型进行扩容缩容 (LVM),xfs分区类型是不支持正常缩容,只能强制缩容 1.磁盘情况:2.缩容home分区1.备份home数据:2.查找使用 /home 的进程:3.终止这些进程:4.卸载 /home …...
C语言基础知识之函数指针和指针函数
函数指针和指针函数 函数指针和指针函数指向函数的指针返回指针值的函数指针函数和函数指针的区别 问题1_1代码1_1结果1_1 函数指针和指针函数 指向函数的指针 用函数指针变量调用函数 可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个…...
【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏
同时支持TextMeshInputFied,支持全屏。 使用github包【WebGLInput】:https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入,只需…...
vue3+vite全局引入less变量和函数
需要在vite配置 plugins: [css: {preprocessorOptions: {less: {additionalData: import "./src/styles/variables.module.less"; import "./src/views/Visualization/component/ViewportCom/px2viewport.less";,javascriptEnabled: true}}}, ]多个文件按…...
H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技
华强盛导读:在当今这个日新月异的汽车科技领域,每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统(BMS),其高效稳定的运行不仅关乎续航与安全,更是智能化驾驶体验的基石。而在这背后ÿ…...
C语言.回调函数
回调函数 回调函数也是一个函数。与一般函数直接调用区别在于,使用回调函数的过程,是一个函数将另一个函数作为参数调用。而被用来调用的那个函数,就是回调函数。 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地…...
《从零开始:使用Python构建简单Web爬虫》
前言 随着互联网信息的爆炸性增长,如何高效地获取和处理这些数据变得越来越重要。Web爬虫作为一种自动化工具,可以帮助我们快速抓取所需的网页内容。本文将介绍如何使用Python编写一个简单的Web爬虫,并通过实例演示其基本用法。 准备工作 …...
最新个人免签约支付系统源码|PHP源码 | 码支付系统 | ThinkPHP6框架 | 开源
源码介绍: 这个最新的个人专用免签约支付系统源码!是PHP源码写的哦,而且是用ThinkPHP6框架开发的,完全开源的码支付系统。 这个系统适合个人用户使用,作为收款的免签约解决方案。它还加入了监控端,可以拒…...
The Llama 3 Herd of Models 第4部分后训练的全文
Llama 3前三部分包括介绍、总体概述和预训练https://blog.csdn.net/qq_51570094/article/details/140682445?spm=1001.2014.3001.5501 4 Post-Training 后训练 我们通过应用几轮后训练6或将模型与人类反馈对齐来生成对齐的Llama 3模型(Ouyang等人,2022;Rafailov等人,2024)在…...
MongoDB性能调优
文章目录 MongoDB性能调优MongoDB性能不佳原因影响MongoDB性能的因素MongoDB性能监控工具mongostatmongotopProfiler模块db.currentOp() MongoDB性能调优 MongoDB性能不佳原因 慢查询阻塞等待硬件资源不足 1,2通常是因为模型/索引设计不佳导致的 排查思路:按1-2…...
【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)
【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数) 文章目录 Log输出方式qInstallMessageHandler回调函数线程安全textEdit控件附录:C语言到C的入门知识点(主要适用于C语言精通到Qt的C开发…...
【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现
文章目录 一、UDP业务逻辑实现二、TCP流套接字编程2.1 API 介绍:2.1.1 ServerSocket:2.1.2 Socket: 2.2 Java流套接字通信模型:2.3 代码示例:2.3.1 TCP Echo Server:2.3.2 TCP Echo Client:2.3.…...
前端过渡动画
前端过渡动画 vue3 1、组件进入视口时向上移动且渐显 1、创建js文件addViewportEffect.js function slideDownEffect(element) {console.log("执行");element.style.transform translateY(0);element.style.opacity 1; }/*** 添加视口效果到指定的类名元素上。…...
actual combat 38 ——vue
vue-cli脚手架 创建命令:vue create 项目名称 eslint 如何关闭? vue.config.js文件中加 module.exports {lintOnSave: false }文件全代码: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpile…...
测试面试宝典(四十七)— 功能测试用例一般包含哪些内容
首先,明确测试用例的编号和名称,以便于识别和管理。 其次,详细描述测试的目标和背景,让其他人能够清楚了解该测试用例的目的和适用场景。 接着是测试的步骤,需要清晰、准确地列出每一个操作步骤,包括输入…...
rust_mac环境安装
在 macOS 上安装 Rust 很简单。你可以使用 Rust 提供的安装工具 rustup。下面是安装步骤: 打开终端。 运行以下命令以安装 rustup 和 Rust: curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh按照提示进行操作: 这个命令将下载并…...
【前端面试】七、算法-递归
常考算法 排序算法:快速排序、归并排序、堆排序等。 查找算法:二分查找、哈希表查找等。 动态规划:解决最优化问题,如斐波那契数列、最长公共子序列等。 图论算法:最短路径(Dijkstra、Floyd-Warshall&am…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...
21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
小伙伴们,有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL, 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始,OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...
二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...
C/Python/Go示例 | Socket Programing与RPC
Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流,会涉及到许多有意思的话题,诸如怎么确保对方能收到信息,怎么应对数据丢失、被污染或者顺序混乱,怎么提高…...
Tableau for mac 驱动
Tableau 驱动程序安装指南 对于希望在 Mac OS 上使用 Tableau 进行数据分析的用户来说,确保正确安装相应的驱动程序至关重要。Tableau 支持多种数据库连接方式,并提供官方文档指导如何设置这些连接。 安装适用于 Mac 的 JDBC 或 ODBC 驱动程序 为了使…...
