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

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

数学中的函数

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

编程中的函数

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

使用函数的优点

  • 代码复用性

    • 函数可以在程序的多个地方被调用,避免了重复编写相同的代码。例如,在一个需要多次计算阶乘的程序中,可以定义一个计算阶乘的函数:
    cpp 复制代码
    int factorial(int n) {
      if (n == 0) {
        return 1;
      }
      int result = 1;
      for (int i = 1; i <= n; ++i) {
        result *= i;
      }
      return result;
    }

    然后在程序的不同部分,只要需要计算阶乘,就可以调用这个函数,而不必每次都重新编写计算阶乘的循环代码。

  • 提高可读性和可维护性

    • 当程序规模较大时,将功能划分为多个函数可以使代码结构更加清晰。例如,在一个游戏开发程序中,有函数用于处理玩家移动、函数用于渲染画面、函数用于处理碰撞检测等。每个函数都有明确的功能,这样阅读代码的人可以更容易地理解程序的逻辑。而且当需要修改某个功能时,只需要在对应的函数内部进行修改,而不会影响到程序的其他部分。
  • 便于调试

    • 因为函数是独立的代码单元,在调试程序时,可以单独对每个函数进行测试和调试。如果程序出现错误,可以更快地定位是哪个函数出了问题,然后针对该函数进行检查和修复。例如,通过在函数内部添加调试输出语句或者使用调试工具来检查函数的参数、中间变量和返回值是否符合预期。
  1. 函数中的算法
    • 排序算法(以简单插入排序为例)

      • 插入排序的基本思想是将一个数据插入到已经排好序的序列中。在函数中实现插入排序可以这样写:
      cpp 复制代码
      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),通过嵌套的循环实现插入排序。外层循环遍历数组中未排序的部分,内层循环用于将当前元素插入到已排序的部分中合适的位置。

    • 搜索算法(以二分搜索为例)

      • 二分搜索适用于在有序数组中查找特定元素。函数实现如下:
      cpp 复制代码
      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可以将数据写入文件:
      cpp 复制代码
      #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类,用于方便地处理字符串。它支持多种操作,如赋值、拼接、比较、查找等。例如:
      cpp 复制代码
      #include <string>
      int main() {
        std::string str = "Hello";
        str += " World";
        std::cout << str << std::endl;
        return 0;
      }
      • 容器(Containers) :包括vector(动态数组)、list(双向链表)、map(关联容器,键 - 值对存储)等多种容器,用于存储和管理数据集合。以vector为例,它允许动态地添加和删除元素,通过<vector>头文件引入:
      cpp 复制代码
      #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中的元素进行排序:
      cpp 复制代码
      #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)等。例如,计算一个角度的正弦值:
      cpp 复制代码
      #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
      cpp 复制代码
      #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表达式自定义排序规则:
      cpp 复制代码
      #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中查找一个整数:
      cpp 复制代码
      #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中某个整数出现的次数:
      cpp 复制代码
      #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,提供了高精度的日期和时间操作)等功能。
      • 示例代码 - 智能指针使用
      cpp 复制代码
      #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提供了丰富的计算机视觉算法和工具,包括图像滤波、特征提取、目标检测、图像分割等功能。它在图像和视频处理领域应用广泛。
      • 示例代码 - 图像灰度化
      cpp 复制代码
      #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;
      }
相关推荐
WANGWUSAN662 分钟前
Python高频写法总结!
java·linux·开发语言·数据库·经验分享·python·编程
forNoWhat11 分钟前
java小知识点:比较器
java·开发语言
坐井观老天16 分钟前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
代码中の快捷键23 分钟前
java开发面试有2年经验
java·开发语言·面试
Marzlam24 分钟前
sql server索引优化语句
开发语言·数据库
谢家小布柔29 分钟前
Java 中的字符串
java·开发语言
码老白29 分钟前
【老白学 Java】HashSet 应用 - 卡拉 OK(五)
java·开发语言
染指111036 分钟前
50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id
c++·windows·lua·游戏安全·反游戏外挂·游戏逆向·luastudio
sjsjs1144 分钟前
【多维DP】力扣3122. 使矩阵满足条件的最少操作次数
算法·leetcode·矩阵
哲学之窗1 小时前
齐次矩阵包含平移和旋转
线性代数·算法·矩阵