C++-----函数与库

数学中的函数与编程中的函数对比

数学中的函数

 - 数学函数是一种映射关系,例如,函数\(y = f(x)=x^{2}\),对于每一个输入值\(x\),都有唯一确定的输出值\(y\)。它侧重于描述变量之间的数量关系,通常通过公式来表示这种关系,并且关注的是函数的定义域(\(x\)的取值范围)、值域(\(y\)的取值范围)、单调性、奇偶性等数学性质。

编程中的函数

 - 编程中的函数是一段封装好的代码块,用于执行特定的任务。例如,一个计算两个整数相加的C++函数:```cppint add(int a, int b) {return a + b;}```它接收参数(这里是\(a\)和\(b\)),执行操作(将\(a\)和\(b\)相加),然后返回结果。编程中的函数除了计算功能外,还涉及到参数传递方式(值传递、引用传递)、变量作用域、返回值类型等编程概念。

使用函数的优点

  • 代码复用性
    • 函数可以在程序的多个地方被调用,避免了重复编写相同的代码。例如,在一个需要多次计算阶乘的程序中,可以定义一个计算阶乘的函数:
    int factorial(int n) {if (n == 0) {return 1;}int result = 1;for (int i = 1; i <= n; ++i) {result *= i;}return result;
    }
    
    然后在程序的不同部分,只要需要计算阶乘,就可以调用这个函数,而不必每次都重新编写计算阶乘的循环代码。
  • 提高可读性和可维护性
    • 当程序规模较大时,将功能划分为多个函数可以使代码结构更加清晰。例如,在一个游戏开发程序中,有函数用于处理玩家移动、函数用于渲染画面、函数用于处理碰撞检测等。每个函数都有明确的功能,这样阅读代码的人可以更容易地理解程序的逻辑。而且当需要修改某个功能时,只需要在对应的函数内部进行修改,而不会影响到程序的其他部分。
  • 便于调试
    • 因为函数是独立的代码单元,在调试程序时,可以单独对每个函数进行测试和调试。如果程序出现错误,可以更快地定位是哪个函数出了问题,然后针对该函数进行检查和修复。例如,通过在函数内部添加调试输出语句或者使用调试工具来检查函数的参数、中间变量和返回值是否符合预期。
  1. 函数中的算法
    • 排序算法(以简单插入排序为例)
      • 插入排序的基本思想是将一个数据插入到已经排好序的序列中。在函数中实现插入排序可以这样写:
      void insertionSort(int arr[], int n) {for (int i = 1; i < n; ++i) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
      }
      
      这个函数接收一个整数数组(arr`和数组的长度(n),通过嵌套的循环实现插入排序。外层循环遍历数组中未排序的部分,内层循环用于将当前元素插入到已排序的部分中合适的位置。
    • 搜索算法(以二分搜索为例)
      • 二分搜索适用于在有序数组中查找特定元素。函数实现如下:
      int binarySearch(int arr[], int l, int r, int x) {while (l <= r) {int mid = l + (r - l) / 2;if (arr[mid] == x) {return mid;} else if (arr[mid] < x) {l = mid + 1;} else {r = mid - 1;}}return -1;  // 表示未找到元素
      }
      
      这个函数接收有序数组(arr`、搜索区间的左边界(l)、右边界(r)和要搜索的元素(x)。通过不断将搜索区间减半,直到找到目标元素或者确定目标元素不存在。在每次循环中,计算中间元素的索引(mid),然后根据中间元素与目标元素的大小关系来调整搜索区间。
      在这里插入图片描述

c++库

  1. C++标准库基础

    • 头文件与命名空间
      • C++标准库的功能通过一系列头文件提供。这些头文件中的内容大多位于std命名空间下。例如,<iostream>头文件提供输入输出功能,像std::cout用于标准输出,std::cin用于标准输入。使用时可以通过using namespace std;std命名空间整体引入,但这可能导致命名冲突,更好的做法是部分引入,如using std::cout; using std::cin;或者在使用时始终加上std::前缀。
    • 核心组件分类
      • 输入输出流(I/O Streams):由<iostream>等头文件提供,除了基本的控制台输入输出std::coutstd::cin,还包括文件输入输出流(fstream)。例如,使用std::ofstream可以将数据写入文件:
      #include <iostream>
      #include <fstream>
      int main() {std::ofstream outFile("output.txt");if (outFile) {outFile << "Hello, file!" << std::endl;outFile.close();} else {std::cerr << "无法打开文件" << std::endl;}return 0;
      }
      
      • 字符串处理(String Manipulation)<string>头文件提供了std::string类,用于方便地处理字符串。它支持多种操作,如赋值、拼接、比较、查找等。例如:
      #include <string>
      int main() {std::string str = "Hello";str += " World";std::cout << str << std::endl;return 0;
      }
      
      • 容器(Containers):包括vector(动态数组)、list(双向链表)、map(关联容器,键 - 值对存储)等多种容器,用于存储和管理数据集合。以vector为例,它允许动态地添加和删除元素,通过<vector>头文件引入:
      #include <vector>
      int main() {std::vector<int> numbers;numbers.push_back(1);numbers.push_back(2);for (int num : numbers) {std::cout << num << " ";}return 0;
      }
      
      • 算法(Algorithms)<algorithm>头文件提供了大量用于处理容器等数据结构的算法,如排序(sort)、查找(find)、计数(count)等。这些算法可以应用于不同的容器类型。例如,对vector中的元素进行排序:
      #include <vector>
      #include <algorithm>
      int main() {std::vector<int> numbers = {3, 1, 2};std::sort(numbers.begin(), numbers.end());for (int num : numbers) {std::cout << num << " ";}return 0;
      }
      
      • 数学函数(Mathematical Functions)<cmath>头文件提供了常见的数学函数,如三角函数(sincostan)、指数函数(exp)、对数函数(loglog10)等。例如,计算一个角度的正弦值:
      #include <cmath>
      int main() {double angle = 45.0;double radians = angle * M_PI / 180.0;double sineValue = std::sin(radians);std::cout << sineValue << std::endl;return 0;
      }
      
  2. 标准库深入探究 - 容器

    • 容器的特性与选择
      • vector:是一种连续存储的容器,类似于数组,但可以动态增长。它支持随机访问,即可以通过索引快速访问元素(时间复杂度为(O(1))),在末尾插入和删除元素效率较高(平均时间复杂度为(O(1))),但在中间插入或删除元素可能需要移动大量元素,效率较低(时间复杂度为(O(n)),(n)为容器中的元素个数)。适用于需要频繁访问元素和在末尾操作元素的场景。
      • list:是一个双向链表容器,它不支持随机访问,但在任意位置插入和删除元素的效率都很高(时间复杂度为(O(1)))。适用于需要频繁插入和删除元素,而对随机访问要求不高的场景。
      • mapunordered_mapmap是基于红黑树实现的关联容器,它存储键 - 值对,并且按键的顺序自动排序。unordered_map是基于哈希表实现的,它提供更快的查找速度(平均时间复杂度为(O(1))),但元素的顺序是无序的。map适用于需要按键排序并且频繁进行查找、插入和删除操作的场景,unordered_map适用于对查找速度要求极高,而对元素顺序没有要求的场景。
    • 容器的迭代器(Iterators)
      • 迭代器是用于遍历容器中元素的工具,类似于指针。不同容器有不同类型的迭代器,但它们都提供了基本的操作,如begin()返回指向容器第一个元素的迭代器,end()返回指向容器最后一个元素之后的迭代器。例如,使用迭代器遍历vector
      #include <vector>
      int main() {std::vector<int> numbers = {1, 2, 3};std::vector<int>::iterator it;for (it = numbers.begin(); it!= numbers.end(); ++it) {std::cout << *it << " ";}return 0;
      }
      
  3. 标准库深入探究 - 算法

    • 算法的通用性与灵活性
      • C++标准库算法具有很高的通用性,可以应用于不同类型的容器和数据结构。例如,std::sort算法可以对任何支持随机访问迭代器的容器进行排序,如vectorarray等。算法通过迭代器来操作容器中的元素,而不依赖于特定容器的内部实现。这种设计使得算法可以轻松地在不同场景下复用。
      • 算法还具有灵活性,可以通过函数对象(Functors)或lambda表达式来定制操作。例如,使用lambda表达式自定义排序规则:
      #include <vector>
      #include <algorithm>
      int main() {std::vector<int> numbers = {3, 1, 2};std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a > b;});for (int num : numbers) {std::cout << num << " ";}return 0;
      }
      
    • 常用算法示例
      • 查找算法(find:用于在容器中查找特定元素。例如,在vector中查找一个整数:
      #include <vector>
      #include <algorithm>
      int main() {std::vector<int> numbers = {1, 2, 3};std::vector<int>::iterator it = std::find(numbers.begin(), numbers.end(), 2);if (it!= numbers.end()) {std::cout << "找到元素" << std::endl;} else {std::cout << "未找到元素" << std::endl;}return 0;
      }
      
      • 计数算法(count:用于计算容器中某个元素出现的次数。例如,计算vector中某个整数出现的次数:
      #include <vector>
      #include <algorithm>
      int main() {std::vector<int> numbers = {1, 2, 2, 3};int countValue = std::count(numbers.begin(), numbers.end(), 2);std::cout << "元素2出现的次数为: " << countValue << std::endl;return 0;
      }
      
  4. 第三方库介绍与使用

    • 获取与安装第三方库
      • 第三方库的获取方式多样。一些常见的方式包括从官方网站下载源代码,然后按照库提供的安装说明进行编译和安装;也可以使用包管理器,如在Linux系统下可以使用apt - get(Debian/Ubuntu)或yum(CentOS/RHEL)安装某些C++库,在Windows和跨平台开发中,vcpkgconan是比较流行的C++库包管理器。
    • 示例:Boost库
      • 功能概述:Boost是一个功能强大的C++库集合,涵盖了众多领域。它提供了智能指针(如shared_ptrunique_ptr,用于更安全的内存管理)、多线程支持(threadmutex等,用于开发并发程序)、日期时间处理(date_time,提供了高精度的日期和时间操作)等功能。
      • 示例代码 - 智能指针使用
      #include <iostream>
      #include <boost/shared_ptr.hpp>
      int main() {boost::shared_ptr<int> ptr(new int(10));std::cout << *ptr << std::endl;return 0;
      }
      
    • 示例:OpenCV库(计算机视觉)
      • 功能概述:OpenCV提供了丰富的计算机视觉算法和工具,包括图像滤波、特征提取、目标检测、图像分割等功能。它在图像和视频处理领域应用广泛。
      • 示例代码 - 图像灰度化
      #include <opencv2/opencv.hpp>
      int main() {cv::Mat image = cv::imread("image.jpg");if (image.empty()) {std::cerr << "无法读取图像" << std::endl;return -1;}cv::Mat grayImage;cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);cv::imshow("Gray Image", grayImage);cv::waitKey(0);return 0;
      }
      

在这里插入图片描述

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

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

相关文章

Loki 微服务模式组件介绍

目录 一、简介 二、架构图 三、组件介绍 Distributor&#xff08;分发器&#xff09; Ingester&#xff08;存储器&#xff09; Querier&#xff08;查询器&#xff09; Query Frontend&#xff08;查询前端&#xff09; Index Gateway&#xff08;索引网关&#xff09…

C++ OpenGL学习笔记(1、Hello World空窗口程序)

终于抽出时间系统学习OpenGL 教程&#xff0c;同时也一步一步记录怎样利用openGL进行加速计算。 目录 1、环境准备1.1、库的下载1.2、库的选择及安装 2、OpenGL第一个项目&#xff0c;Hello World!2.1、新建hello world控制台项目2.2、配置openGL环境2.2.1 包含目录配置2.2.2 …

Linux系统命令基础

Linux命令⾏ [pypylinux ~]$ 普通⽤户py&#xff0c;登陆后 [rootpylinux ~]# 超级⽤户root&#xff0c;登录后root代表当前登录的⽤户 分隔符pylinux 主机名~ 当前的登录的位置&#xff0c;此时是家⽬录# 超级⽤户身份提示符 $ 普通⽤户身份提示符操作系统⽬录分隔符 Linux目录…

不同版本的 Redis 的键值对内存占用情况示例

不同版本的 Redis 的键值对内存占用情况示例 文章目录 不同版本的 Redis 的键值对内存占用情况示例Redis 6.0redisObjectdictEntrysds&#x1f340; 数据结构&#x1f340; sdslen() 函数&#x1f340; sdsReqType() 函数&#x1f340; sdsHdrSize() 函数 内存分配 - malloc() …

实现 WebSocket 接入文心一言

目录 什么是 WebSocket&#xff1f; 为什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的优势 总结&#xff1a;HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …

2024.7 XAI 遇见 LLM:可解释 AI 与大型语言模型之间关系的调查

https://arxiv.org/pdf/2407.15248 问题 Q1&#xff1a;XAI 技术当前如何与 LLMs 集成&#xff1f;Q2&#xff1a;将 LLMs 与 XAI 方法融合的新兴趋势是什么&#xff1f;Q3&#xff1a;当前相关文献存在哪些差距&#xff0c;哪些领域需要进一步研究&#xff1f; 挑战 LLMs …

RIP实验

要求及分析 路由器上分别配置环回 连接路由器的线路网段为12.1.1.0/24、23.1.1.1.0/24 R1和R3连接的网络地址分别为192.168.1.0/24/192.168.2.0/24 整个网络使用RIP达到全网可达 配置 先配置路由器各接口ip和环回和pc ip网关掩码&#xff08;图略&#xff09; 进行 RI…

Oracle 中间件 Webcenter Portal服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…

macOS 配置 vscode 命令行启动

打开 vscode 使用 cmd shift p 组合快捷键&#xff0c;输入 install 点击 Install ‘code’ command in PATH Ref https://code.visualstudio.com/docs/setup/mac

分层架构 IM 系统之多媒体功能设计与实现

现在 IM 系统已经不仅限于文本消息的通讯了&#xff0c;多媒体数据占据越来越多的比重&#xff0c;比如&#xff1a;文件传输、语音通话、视频通话等。 在前面的文章&#xff08;《基于需求分析模型来结构化剖析 IM 系统》&#xff09;中我们分析过&#xff0c;“多媒体消息”…

0.gitlab ubuntu20.04 部署问题解决

安装依赖&#xff1a; ① sudo apt-get update 出现&#xff1a; 解决方式&#xff1a; 去 /etc/apt/sources.list.d 这个目录删除或注释对应的list文件 第三方软件的源一般都以list文件的方式放在 /etc/apt/sources.list.d 这个目录 重新运行sudo apt-get update 安装…

Next.js v15 - 服务器操作以及调用原理

约定 服务器操作是在服务器上执行的异步函数。它们可以在服务器组件和客户端组件中调用&#xff0c;用于处理 Next.js 应用程序中的表单提交和数据修改。 服务器操作可以通过 React 的 “use server” 指令定义。你可以将该指令放在 async 函数的顶部以将该函数标记为服务器操…

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作&#xff0c;从而能快速的做出更好的决策。 目 录&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

Bcrypt在线密码加密生成器

具体前往&#xff1a;在线Bcrypt加密工具--使用bcrypt及生成salt的迭代次数强度参数计算生成哈希(摘要)

wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势

开发CuteMySQL/CuteSqlite开源客户端的时候&#xff0c;需要使用Scintilla编辑器&#xff0c;来高亮显示SQL语句&#xff0c;作为C/C领域最成熟稳定又小巧的开源编辑器&#xff0c;Scintilla提供了强大的功能&#xff0c;wxWidgets对Scintilla进行包装后的是控件类&#xff1a;…

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中&#xff0c;异步任务处理是一个常见的需求。无论是数据处理、图像生成&#xff0c;还是复杂的计算任务&#xff0c;异步执行都能显著提升系统的响应速度和吞吐量。今天&#xff0c;我们将通过一个实际项目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG&#xff08;Retrieval-augmented Generation&#xff0c;检索增强生成&#xff09;引擎。 主要作用&#xff1a; 让用户创建自有知识库&#xff0c;根据设定的参数对知识库中的文件进行切块处理&#xff0c;用户向大…

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…