C++学习笔记----3、设计专业的C++程序(六)---- 重用既有代码(选择库重用指导一)

news2024/12/23 22:20:26

        当你决定使用库、框架、同事的代码、整个应用或者你自己的代码的时候,要记住选择正确的代码重用的几个指导原则。

1、理解功能与限制

        要花时间去熟悉代码。理解其功能与限制还是很重要的。开始阅读文档与公开接口或API。理想情况下,有这些去理解怎么使用该代码就够了。然而,如果库没有提供清晰接口与实现的分别的话,如果有源码,你可能需要去看源码了。还有,你可以与用过这些代码的程序员沟通,可能能解释一些奇奇怪怪的东东。一开始要学习其基本功能。如果是一个库,那么它提供了什么功能?如果是一个框架,怎么让你的代码匹配?要继承什么样的类?要自己写什么样的代码?还要考虑依赖代码类型的特定问题。

        当选择库时要记住以下几点:

  • 在多线程编程时使用库是否安全?
  • 库是否暗含了使用代码的特定编译器设定?如果答案为是的话,你的项目是否可以接受。
  • 该库是否还依赖其他库?

        还有,对于特定库还要做一些细节的考察:

  • 需要什么样的初始化与清除调用?
  • 如果你需要继承类,需要调用哪个构造器?需要重写哪个虚成员函数?
  • 如果调用返回内存指针,谁负责释放内存:调用者还是库函数?如果库函数负责的话,它什么时候释放?强烈推荐看看是否可以使用智能指针来管理库分配的内存。
  • 调用返回企的类型是值还是引用?
  • 可能抛出的异常
  • 库调用错误情况的检测,有没有假设条件?错误是怎么处理的?客户程序怎么展示错误?避免使用库跳出消息框,在标准输出上打印信息,或者中断程序运行。应该由客户程序决定怎么通知用户错误,而不是库。

2、理解学习成本

        学习成本是指开发者学习怎么使用库花费的总的时间。并不只是开始使用库时初始成本,而是随着时间推移不断增加的成本。只要当成员加入项目,就需要学习使用库。

        对于特定库该花费是非常大的。这种情况下,如果发现你需要的功能在众所周知的库中,建议你使用该库,而不是使用那些外部的并不为人所知的库。例如,如果标准库提供了你需要的数据结构和算法,就用它了,别管其他的。

3、理解性能

        了解库或者其他代码提供的性能保证是非常重要的。即使你的程序对性能不敏感,也要确信使用的代码不能在你的使用中拥有糟糕的性能。

3.1大O符号

        程序员通常讨论或者记述算法和类性能时使用大O符号。我们就来简单讨论并解释一下算法复杂性的一般概念和大O符号,并不涉及不必要的深奥的数学知识。如果你很熟了,可以略过。

        大O符号表明的是相对而不是绝对的性能。例如,它不会说一个算法运行了多长的时间,比如说30毫秒,大O符号给出了一个算法当它的输入增长时怎样执行。举例说明,输入要排序的元素数目给排序算法,在键值查询时哈希表中的元素数量,磁盘之间复制文件的大小等。

        大O符号只应用于其速度依赖于输入的算法。不适用于没有输入或者运行时间随机的算法。实践上,你会发现,大多数感兴趣的算法的运行时间都取决于它们的输入。所以这个限制影响不大。

        正式一点的说法,大O符号给出了以输入大小多少作为参数的函数算法的运行时间,也就是大家所说的算法的复杂性。其实并不像听起来那么复杂。例如,一个算法可以两倍的时间处理两倍的输入元素。这样的话,如果1秒钟处理200个元素,那么2秒钟就会处理400个元素,4秒钟就会处理800个元素。如下图所示。也就是说,这个算法的复杂性是线性的,因为从图示可以看出,画出来就是一条直线。

        大O符号总结该算法的线性性能表示为:O(n)。O只是表示你用大O符号,而n代表了输入的数量。O(n)给出的就是算法速度为输入数量的线性函数。

        当然了,并不是所有的算法都是输入数量的线性性能。下表总结了一些通常的复杂性,以从最好到最差的性能顺序排序。

算法复杂性
算法复杂性大O符号解析算法举例
常数O(1)运行时间与输入数量无关访问数组中的单个元素
对数O(log n)运行时间是输入数量的以2为底的对数的函数以二分法在排好序的列表中查找一个元素
线性O(n)运行时间与输入数量成正比在没有排序的列表中查找一个元素
线性对数O(n log n)运行时间是输入数量的对数函数的线性倍数的函数合并分类查找
平方O(n^{2})运行时间是输入数量的平方的函数像选择排序的慢性排序查找
指数O(2^{n})运行时间是输入数量的指数函数优化旅行销售员问题

        给出函数的输入数量而不是绝对数的性能有如下两个好处:

  •  与平台相关。在一台计算机上以200毫秒运行一段代码不能说明在第二台计算机上就是这个数字。如果不是同样的负载在同一台计算机上运行也很难比较两个不同的算法。另一方面,根据输入数量给给出函数的性能适用于任何平台。
  • 输入数量的函数性能包含了一定规格的算法的所有可能的输入。一个算法运行所用的以秒计的特定时间只包含了一种特定的输入,而与其他输入无关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chromedriver下载地址大全(包括124.*后)以及替换exe后仍显示版本不匹配的问题

Chrome for Testing availability CNPM Binaries Mirror 若已经更新了系统环境变量里的chromdriver路径下的exe,仍显示版本不匹配: 则在cmd界面输入 chromedriver 会跳出version verison与刚刚下载好的exe不匹配,则再输入: w…

使用 Python 绘制词云图的详细教程

如何使用python绘制词云图 词云图(Word Cloud)是数据可视化中常用的一种技术,通过将文字以不同的大小、颜色和方向排列,以展示文本数据中词汇的频次和重要性。对于文本分析、情感分析、关键词提取等应用,词云图都能够…

软件设计师教程(第5版)第3章 数据结构(更新中)

【数据结构】是指数据元素的集合及元素间的相互关系和构造方法。P99 元素之间的相互关系是数据的【逻辑结构】。P99 数据元素及元素之间关系的存储称为【存储结构】(或【物理结构】)。P99 数据结构按照【逻辑关系】的不同分为【线性结构】和【非线性结构】两大类。P99 【非…

计算机组成原理(4):指令系统/控制器

1 指令格式 【补充知识】 计算机语言的层级关系:机器语言 - 汇编语言 - 高级语言; ​ 机器语言用二进制来编写,用来反映硬件的语言。但是二进制编写太难了,就诞生了汇编语言,对其编程进行封装、简化; ​ …

C++ | Leetcode C++题解之第357题统计各位数字都不同的数字个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countNumbersWithUniqueDigits(int n) {if (n 0) {return 1;}if (n 1) {return 10;}int ans 10, cur 9;for (int i 0; i < n - 1; i) {cur * 9 - i;ans cur;}return ans;} };

8.Java基础概念-方法

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 什么是方法 方法是程序…

QT 与 C++实现基于[ TCP ]的聊天室界面

TCP客户端 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket> //客户端类 #include <QMessageBox> #include <QListWidgetItem> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …

基于YOLO V8的PCB缺陷检测识别系统(python源码+Pyqt5界面+数据集+训练代码)

数据集准备&#xff1a;收集并标注PCB缺陷的图像。模型训练&#xff1a;使用YOLO v8框架训练一个模型来识别这些缺陷。GUI开发&#xff1a;利用PyQt5创建一个用户友好的图形界面。模型部署&#xff1a;在GUI中集成训练好的模型&#xff0c;使用户能够上传PCB图像并得到缺陷检测…

数据结构-树(二叉树)-第三天

结合leetcode学习c 学习资料来源 定义 二叉树&#xff08;binary tree&#xff09;是一种非线性数据结构&#xff0c;代表“祖先”与“后代”之间的派生关系&#xff0c;体现了“一分为二”的分治逻辑。 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每个节点包含…

[数据集][目标检测]停车场空位检测数据集VOC+YOLO格式7959张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7959 标注数量(xml文件个数)&#xff1a;7959 标注数量(txt文件个数)&#xff1a;7959 标注…

p9 镜像的基本命令

docker的常用命令 帮助命令 查看docker的版本 docker version2. 查看当前安装的docker的详细的信息 docker的系统信息包括镜像和容器的数量 docker info3. 查询帮助命令 image是你想要获取哪一个命令的帮助文档,一般百度或者人工智能就行所有命令的可选项都可以用这个–hel…

DN专业3D图形制作软件win/mac软件安装下载(附下载链接)

目录 一、软件概述 1.1 Adobe DN简介 1.2 Windows/Mac系统要求 Windows系统&#xff1a; Mac系统&#xff1a; 二、安装步骤 2.1 下载与解压 2.2 安装程序 2.3 启动软件 三、使用教程 3.1 界面介绍 3.2 创建和编辑3D内容 3.3 合成与渲染 四、高级技巧与注意事项 …

.NET内网实战:通过DNS查找出网主机

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧&#xff0c;对内网和后渗透感兴趣的朋友们可以订阅该电子报刊&#xff0c;解锁更多的报刊内容。 02基本介绍 03编码实现 在红队活动中&…

Modbus 数据帧解析

Modbus 是一种通信协议&#xff0c;广泛应用于工业自动化系统中&#xff0c;用于连接电子设备。它是一种基于主从结构的通信协议&#xff0c;其中主设备可以与多个从设备通信。数据通过一系列的帧进行传输&#xff0c;每一帧包含多个字段&#xff0c;每个字段都有特定的功能。 …

SQL进阶技巧:最近有效的缺失值填充问题【last_value实现版】

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 场景:现在有一张商品入库表,包括商品id、商品成本和入库日期3个字段,由于某些原因,导致部分商品的成本缺失(为0或者没有值都是缺失),这样不利于我们计算成本。所以现在要把缺失的商品进价补充完整,补充的…

OpenCTI:开源网络威胁情报平台

OpenCTI 是一个开源平台&#xff0c;旨在帮助组织管理其网络威胁情报 (CTI) 数据和可观察数据。 该平台由 Filigran 开发&#xff0c;使用基于 STIX2 标准的知识模式构建数据。 它采用现代 Web 应用程序架构&#xff0c;配备 GraphQL API 和用户友好的前端。 OpenCTI 与 MIS…

MySQL在Windows和Ubuntu上的安装与远程连接配置

MySQL是一个广泛使用的开源关系数据库管理系统&#xff0c;适用于各种操作系统。本文将详细介绍如何在Windows和Ubuntu系统上安装MySQL&#xff0c;并配置远程连接。 1. 在Windows上安装MySQL 1.1 下载MySQL安装包 首先&#xff0c;访问MySQL官方网站&#xff08;https://de…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑模块冗余和系统状态的多...电系统可靠性的蒙特卡洛分析》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【Java日志系列】JCL、SLF4J日志门面

目录 前言 一、日志门面概述 1. 门面模式&#xff08;外观模式&#xff09; 2. 日志门面 二、JCL 1. JCL组件结构 2. JCL案例 三、SLF4J 1. SLF4J简介 2. SLF4J桥接技术 3. 快速入门 4. SLF4J集成日志实现 4.1 集成nop 4.2 集成Logback 4.3 集成Log4j 4.4 集成…

一文彻底搞懂Transformer - 总体架构,零基础入门到精通,收藏这一篇就够了

Transformer 一、RNN编码器-解码器架构**** ********序列到序列模型&#xff08;Seq2Seq&#xff09;&#xff1a;Seq2Seq模型的目标是将一个输入序列转换成另一个输出序列&#xff0c;这在多种应用中都具有广泛的实用价值&#xff0c;例如语言建模、机器翻译、对话生成等。 …