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

news2024/12/23 6:22:44

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

数学中的函数

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

编程中的函数

 - 编程中的函数是一段封装好的代码块,用于执行特定的任务。例如,一个计算两个整数相加的C++函数:
 ```cpp
 int 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.coloradmin.cn/o/2264099.html

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

相关文章

带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式适配器模式&#xff08;Adapter Pattern&#xff09;概述talk is cheap&#xff0c; show you my code总结 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是面向对象软件设计中的一种结构型设计…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

初等函数整理

1.幂函数 2.指数函数 3.对数函数

【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将写到一些手搓常用工具&#xff0c;方便在项目中的使用&#xff0c;并且在手搓的过程中一些函数如&#xff1a;日志 宏中的__VA_ARGS__接收可变参…

路径规划之启发式算法之二十一:狼群算法(Wolf Pack Algorithm,WPA)

狼群算法(Wolf Pack Algorithm,WPA)是一种模拟狼群捕食行为及其猎物分配方式的群体智能优化算法。它由吴虎胜等人在2013年提出,算法采用了基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。它通过抽象狼群搜索、围攻以及更新换代的三种行为方式来实…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】

继上一篇的hello world&#xff1a; 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门hello world输出【入门一】-CSDN博客】 这一篇我们开始任务的创建。 工程还是用上一篇的hello world作为模板&#xff0c;hello world就不再app_main函数中输出&#xff0c;改成在任务…

用音乐与自我对话 ——澄迈漓岛音乐节x草台回声

四季循环&#xff0c;昼夜往复&#xff0c;在相对恒定的日常中&#xff0c;音乐是扇打量世界又内观本心的双向窗户。难以描述的触动&#xff0c;透过音乐语言转换为温热且真实的吟唱&#xff0c;一次又一次记录与释放。 除却生浪主舞台中的声音玩具乐队以及STOLEN秘密行动&…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负&#xff0c;然后下正上负。当二极管接到反向电压&#xff0c;二极管存在寄生电容&#xff0c;电压不能立刻突变&#xff0c;当输入频率变高时&#…

HTTP协议及安全防范

由于图片解析问题&#xff0c;可以点击查看 &#x1f449;&#x1f3fb; 博客原文 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议&#xff0c;客户端通过发送请求到服务器来获取…

LabVIEW深海气密采水器测控系统

LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件&#xff0c;实现了高精度的温度、盐度和深度测量&#xff0c;并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具&#xff0c;用LabVIEW开发了一套测控系统&am…

基于自然语言处理自动分配和高效执行制造任务可提高制造代理的灵活性和适应性

概述 论文地址&#xff1a;https://arxiv.org/abs/2406.01893 本研究提出了一种将大规模语言模型&#xff08;LLMs&#xff09;集成到多代理系统&#xff08;MAS&#xff09;中的新框架&#xff0c;以解决传统制造业在适应动态环境和快速响应生产变化方面所面临的困难。具体来…

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL&#xff1f;前置要求安装过程 步骤一&#xff1a;安装 acme.sh步骤二&#xff1a;配置 ZeroSSL 证书申请 方法一&#xff1a;手动 DNS 验证&#xff08;推荐新手使用&#xff09;方法二&#xf…

越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高

《港湾商业观察》施子夫 12月13日&#xff0c;深圳市越疆科技股份有限公司&#xff08;以下简称&#xff0c;越疆科技&#xff0c;02432.HK&#xff09;发布全球发售公告&#xff0c;公司计划全球发售4000万股股份&#xff0c;其中3800万股国际发售&#xff0c;200万股香港公开…

windows下搭建本地sofa-registry

官方介绍&#xff1a; SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。SOFARegistry 最早源自于淘宝的 ConfigServer&#xff0c;十年来&#xff0c;随着蚂蚁金服的业务发展&#xff0c;注册中心架构已经演进至第五代。目前 SOFARegistry 不仅全面服…

「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件

本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息&#xff0c;页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。 关键词 UI互动应用天气预报数据绑定动态展示状态管理 一、功能说明 自定义…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…

支付域——清结算系统体系

摘要 本文深入探讨了支付清算的基础知识和跨机构清算原理&#xff0c;涵盖了组织、账户、支付工具和系统的基础&#xff0c;支付流程的模型&#xff0c;以及支付清算的全局实现。文章还详细介绍了支付机构的五大业务和支付系统的总架构&#xff0c;并通过案例分析了支付清算的…

javaEE-线程的常用方法-4

目录 一.start():启动一个线程 调用start()方法 start()方法只能调用一次&#xff1a; java中的API: start()和run()的区别: 二.中断一个线程 中断线程方法1:引入标志位 中断线程方法2:调⽤interrupt()⽅法 抛出的异常: 三.等待一个线程 join() 四、获取线程引用 五…

uniapp小案例---趣味打字坤

当点击输入框时出现小鸡打字 当输入框失焦时打字鸡沉下去 原图自取 这里运用了一个三元 :class"isActive?active:"&#xff0c;当聚焦时isActivetrue从而让class绑定&#xff0c;当失焦时isActivefalse <template><view class"out"><inp…

JS使用random随机数实现简单的四则算数验证

1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…