![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
c++日常学习
有了个相册
日常记录
展开
-
C++——函数指针
在C++中,函数指针是指向函数的指针变量。它允许将函数作为参数传递给其他函数、动态选择调用的函数以及在运行时改变函数的行为。函数,然后通过函数指针调用函数1。接着,我们改变函数指针的指向,使其指向。使用括号将函数指针变量括起来,再加上参数列表来调用函数。将函数名赋值给函数指针变量,可以使用取址运算符。在上面的示例中,我们声明了一个函数指针类型。函数,并通过函数指针调用函数2。,它们与函数指针类型匹配。函数中,我们先将函数指针。是函数指针变量的名称,原创 2023-06-25 16:00:37 · 338 阅读 · 0 评论 -
C++——哈希表
首先将 nums1 的所有元素存入哈希表中,然后遍历 nums2,把在哈希表中出现的元素加入到交集中,同时在哈希表中将该元素删除,避免元素重复计算。unordered_map 是基于哈希表的关联容器,提供了高效的插入、查找和删除操作。哈希表(Hash table),也被称为散列表,是一种常用的数据结构,用于实现键-值对的存储和检索。假设有两个数组 nums1 和 nums2,求出它们的交集并返回,其中返回的交集元素要去重。下面是哈希表在 C++ 中的一个经典例子:求解两个数组的交集。原创 2023-05-25 22:06:12 · 753 阅读 · 0 评论 -
C++——图
图是由节点(顶点)和连接节点的边组成的一种非线性数据结构。它用于表示不同对象之间的关系或网络结构。图可以用于建模和解决许多现实世界中的问题,例如社交网络分析、路线规划、图像处理等。在图中,节点表示实体或对象,而边表示节点之间的关系。边可以是有向的(具有方向)或无向的(没有方向),并可以具有权重或标签来表示边的属性或距离。原创 2023-05-22 21:59:21 · 654 阅读 · 0 评论 -
C++——广度优先搜索
由于广度优先搜索是逐层遍历,从根节点开始,先输出根节点的值,然后按照从左到右的顺序依次输出每一层的节点值。广度优先搜索(Breadth-First Search,BFS)是一种图遍历算法,它从起始节点开始逐层扩展搜索,直到找到目标节点或遍历完整个图。首先构建了一个示例的二叉树,然后调用BFS函数执行广度优先搜索,并输出遍历的结果。请注意,广度优先搜索需要注意避免重复访问节点,通常使用一个额外的数组或集合来记录已访问的节点。4、遍历当前节点的所有邻居节点,若邻居节点未被访问过,则标记为已访问并将其加入队列。原创 2023-05-21 16:22:56 · 1910 阅读 · 0 评论 -
C++——深度优先搜索
它从起始节点开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到前一节点,继续探索其他路径,直到遍历完所有节点或找到目标。在深度优先搜索中,每个节点都会被访问且仅被访问一次。如果某个节点的邻居节点已经被访问过,那么该节点将被跳过。在树的问题中,深度优先搜索可以用于查找树的特定节点或进行树的遍历。需要注意的是,深度优先搜索可能会陷入无限循环,因此在应用时需要合理设置终止条件和避免重复访问节点。3、若存在未访问的邻居节点,则选择一个作为当前节点,标记为已访问,并重复步骤2。原创 2023-05-21 15:47:53 · 3326 阅读 · 0 评论 -
C++——递归
递归关系则描述了如何将原问题划分为更小的子问题,并将它们结合起来得到原问题的解。否则,根据递归关系,将问题划分为计算第 n-1 项和第 n-2 项的子问题,并将它们的结果相加。在递归调用过程中,每一次递归都会使问题规模减小,直到达到递归基的情况。递归函数的执行过程可以形象地表示为一个递归树,每个节点代表一次函数调用,树的叶节点对应于递归基。递归的时间复杂度通常与递归的深度成正比,而空间复杂度则取决于递归树的高度和每次递归调用所需的额外空间。需要注意的是,递归函数必须满足结束条件,以避免无限递归。原创 2023-05-19 21:23:28 · 259 阅读 · 1 评论 -
C++——双指针
2、左右指针:在有序数组或字符串中,将一个指针指向开头,另一个指针指向末尾,通过根据问题的要求移动指针来搜索目标值、判断是否满足某个条件等。3、对撞指针:在有序数组或字符串中,将两个指针分别指向开头和末尾,并同时向中间移动,常用于寻找两个数之和、判断是否回文串等问题。1、快慢指针:使用两个指针以不同的速度遍历数组或链表,常用于解决问题如判断链表是否有环、寻找链表的中间节点等。4、快慢指针替换:在某些情况下,可以使用快慢指针来替换传统的单指针遍历,以提高算法的效率。原创 2023-05-18 19:16:28 · 638 阅读 · 0 评论 -
C++——动态规划
它通过将问题分解为更小的子问题,并利用子问题的解来构建原问题的解。在上述示例中,我们通过创建一个二维数组dp来保存子问题的解,其中dp[i][j]表示前i个物品放入容量为j的背包中所能达到的最大价值。动态规划的核心思想是存储并重复使用子问题的解,以避免重复计算。3、确定状态转移方程:找到子问题之间的关系,以及如何利用子问题的解来构建原问题的解。2、确定状态:找到描述子问题的状态变量,以便构建动态规划表。5、求解原问题:根据填充好的表格,求解原问题的解。1、定义子问题:将原问题拆解为较小的子问题。原创 2023-05-18 10:05:30 · 765 阅读 · 0 评论 -
C++——容器(map)
在C++中,map、multimap和unordered_map是三种不同的容器,用于存储键值对。它们各自有不同的特点和适用场景。原创 2023-05-17 17:21:13 · 438 阅读 · 0 评论 -
C++——滑动窗口
滑动窗口算法可以通过维护两个指针,一个指向窗口的起始位置,一个指向窗口的结束位置,并根据目标字符串的出现情况来移动窗口,从而找到最小的覆盖子串。滑动窗口算法可以通过保持一个窗口的和,将窗口向右移动一位,并根据需要调整窗口的大小来解决这个问题。滑动窗口算法的关键是确定窗口的大小和如何移动窗口。滑动窗口算法的基本思想是通过调整窗口的起始位置和结束位置,以有效地处理数据。3、根据问题的要求,调整窗口的起始位置和结束位置,使窗口滑动到下一个位置。1、初始化窗口的起始位置和结束位置,通常为数组或字符串的开头。原创 2023-05-16 21:44:50 · 2285 阅读 · 0 评论 -
C++——容器(set)
插入元素:使用 insert() 函数将元素插入集合中,对于std::unordered_set集合,如果元素已经存在,则插入操作被忽略。对于std::set和std::multiset集合插入新元素时,容器会根据元素的键值将其放置在适当的位置,以保持元素的有序性。查找元素:使用 find() 函数来查找元素,它返回一个指向要查找的元素的迭代器,如果元素不存在,则返回 end()。内部元素按照键的排序顺序进行存储,重复元素的插入会导致多个相同键的元素存在。每个元素在容器中是唯一的,即不允许重复元素。原创 2023-05-16 21:18:37 · 1365 阅读 · 0 评论 -
C++——二分法
如果中间元素等于目标元素,那么查找成功,返回中间位置。如果中间元素大于目标元素,说明目标元素可能在左半部分,更新结束位置为中间位置减1。如果中间元素小于目标元素,说明目标元素可能在右半部分,更新起始位置为中间位置加1。它的基本思想是将查找范围逐渐缩小一半,直到找到目标元素或确定目标元素不存在。如果目标元素不存在于列表中,那么在某个时刻,起始位置将大于结束位置,此时可以确定目标元素不存在。的函数,它接受一个有序整数数组和一个目标元素作为输入,并返回目标元素在数组中的索引。如果目标元素不存在,函数返回-1。原创 2023-05-16 20:01:09 · 1546 阅读 · 0 评论 -
C++——贪心算法
在上述示例中,我们定义了一个greedyCoinChange函数,它接收一个硬币面额的向量coins和需要找零的金额amount。在main函数中,我们定义了一组硬币面额和需要找零的金额,并调用greedyCoinChange函数来获取找零的结果。问题描述如下:给定一些不同面额的硬币和一个需要找零的金额,找出最少的硬币数量来凑出该金额。贪心算法的基本思想是,每一步选择当前情况下看起来最好的解决方案,而不考虑之后可能发生的情况。1、确定问题的最优子结构:问题的最优解可以通过子问题的最优解来构建。原创 2023-05-15 20:36:52 · 1327 阅读 · 0 评论 -
C++——auto
auto是C++11引入的一个关键字,它可以自动推断变量的类型。需要注意的是,自动类型推断并不是万能的,有时候推断出的类型可能与我们期望的不同,此时需要手动指定变量类型。此外,对于函数参数的类型,auto并不能代替,函数定义时必须显式地指定参数类型。上面的代码中,我们使用auto关键字推断函数calculate的返回值类型为int。上面的代码中,我们使用auto关键字定义了迭代器it,编译器会自动推断出它的类型。2. 推断STL容器中的迭代器类型。3. 函数返回值类型推断。1. 推断基本类型变量。原创 2023-05-04 09:59:09 · 161 阅读 · 0 评论 -
C++——迭代器
C++中的迭代器是一种对象,可以用于遍历容器类型(如vector、list等)中的元素。C++中有多种类型的迭代器,包括正向迭代器、反向迭代器、常量迭代器等。其中,container表示容器类型(如vector、list等),iterator表示迭代器类型,it表示定义的迭代器对象名称。- 常量反向迭代器(const_reverse_iterator):可以访问被定义为const的容器中的元素,但不能修改它们。C++中有多种迭代器类型,如正向迭代器、反向迭代器、常量迭代器等。原创 2023-05-04 09:54:37 · 1180 阅读 · 0 评论 -
C++——堆区、栈区
栈区是一段线性的内存区域,它用于存储程序中函数调用时创建的局部变量、函数参数、返回值和其他函数调用相关的信息。栈区的特点是大小固定,程序在执行时自动分配和释放,因此内存管理是由编译器自动完成的。堆区的特点是大小不确定,程序必须显示地分配内存,并在使用后显示地释放内存。堆区的使用依赖于动态内存分配,例如`new`和`delete`操作符。在这个示例中,我们使用了栈区和堆区来创建一个包含5个整数的数组。总之,栈区和堆区都是C++中常见的内存管理技巧。了解它们之间的区别和用法是编写高效和健壮程序的基础。原创 2023-05-03 20:15:51 · 192 阅读 · 0 评论 -
C++——转义字符
在上面的示例程序中,我们使用了转义字符来输出一些特殊字符,例如制表符、换行符、双引号、单引号和反斜杠。注意,在输出反斜杠字符时,我们需要使用两个反斜杠,因为反斜杠本身也是一个转义字符。在C++中,转义字符用于表示一些特殊字符,例如换行符、制表符、双引号、反斜杠等等。原创 2023-04-26 17:01:30 · 2164 阅读 · 0 评论 -
C++——文件操作
可以使用 `std::filesystem` 中的函数来获取文件的属性,并用 `std::filesystem::permissions()` 函数来修改文件权限。可以使用 `std::fstream` 中的 `open()` 函数来创建新的文件,如果文件已经存在,则该函数会将其打开。可以使用 `std::filesystem` 中的 `copy()` 函数来复制文件。可以使用 `std::remove()` 函数来删除文件。原创 2023-04-21 10:56:23 · 331 阅读 · 0 评论 -
C++——文件访问
上述代码中,`std::filesystem::directory_iterator` 用来遍历指定路径下的所有文件和子目录,`entry.is_directory()` 判断当前遍历到的路径是否为目录,如果是,则递归调用 `ListFiles` 函数继续遍历子目录,否则使用 `entry.path().filename()` 输出文件名。原创 2023-04-21 10:38:39 · 331 阅读 · 0 评论 -
C++——类和结构体
在上面的示例中,类“Person”包含两个私有数据成员“name”和“age”,以及一个公共成员函数“print”。该类还有一个构造函数,用于初始化数据成员。在主函数中,我们创建了一个“Person”类的对象“p”,并调用其“print”函数。相反,结构体“PersonStruct”仅包含两个公共数据成员“name”和“age”,没有成员函数。我们创建了一个结构体变量“ps”,并在主函数中打印其数据成员。在C++中,类是一种自定义数据类型,它可以包含数据成员和成员函数,这些成员函数可以操作该类的数据成员。原创 2023-04-17 20:26:50 · 114 阅读 · 0 评论 -
C++——模板
C++ 模板是一种用于创建通用代码的机制,可以在编译时将特定的数据类型参数传递给代码,从而生成具体的代码。使用模板,可以编写通用的算法和数据结构,以便在多个项目和数据类型上重用它们。类模板是用于创建通用类的机制。类模板定义中的一个或多个类型参数允许在编译时指定具体的数据类型。函数模板允许在函数定义中使用一个或多个类型参数,从而创建通用函数。C++ 模板有两种类型:函数模板和类模板。表示一个类型参数,它在函数体中用作类型。表示一个类型参数,它在类定义中用作类型。原创 2023-04-16 16:25:33 · 39 阅读 · 0 评论 -
C++——预处理器
在 C++ 中,头文件(header file)用于包含函数和变量的声明以及其他重要信息,这些信息可以在源文件(source file)中使用。当多个源文件需要使用相同的函数或变量时,我们通常将这些函数或变量的声明放在一个头文件中,然后在每个源文件中包含该头文件。在头文件中,我们通常使用 #define 来定义一个宏,该宏包含头文件的名称。这样,编译器会先读取头文件 "example.h",并将其包含在主函数源代码中,然后将源代码和头文件一起编译成可执行程序。#endif 指令之前添加头文件的声明和定义。原创 2023-04-16 11:45:03 · 189 阅读 · 0 评论 -
C++——运算符重载
在 main() 函数中,创建了两个 Complex 类型的对象 a 和 b,然后通过 a+b 的方式调用了重载的加号运算符,得到了一个新的 Complex 对象 c,然后输出了 c 的实部和虚部。需要注意的是,不能重载的运算符包括 .(成员访问运算符)、.*(成员指针访问运算符)、::(域运算符)、?在 C++ 中,可以使用运算符重载(Operator Overloading)来为自定义数据类型定义运算符的行为。其中,返回类型指定运算符的返回类型,运算符是要重载的运算符,参数列表指定运算符的参数。原创 2023-04-16 09:12:47 · 74 阅读 · 0 评论 -
C++——EKF
在该实现中,EKF类将初始状态向量、状态协方差矩阵、系统模型矩阵、测量模型矩阵、过程噪声协方差矩阵和测量噪声协方差矩阵作为输入。predict()函数使用系统模型矩阵和过程噪声协方差矩阵更新状态和协方差预测。update()函数使用测量模型矩阵、测量噪声协方差矩阵和卡尔曼增益来更新状态和协方差。getState()和get协方差()函数分别返回当前状态向量和协方差矩阵。在C++中,有几个实现EKF算法的库和框架,比如机器人库(RoboLib)、Bayes++和机器人操作系统(ROS)。原创 2023-04-15 19:13:23 · 518 阅读 · 0 评论 -
C++——指针常量、常量指针
需要注意的是,这里的const关键字可以写在*的前面或者后面,它们的含义是不同的。在前面表示指向常量的指针,不能修改所指向的数据;指针常量是一个指针,它的值不能被修改,但是可以修改它所指向的数据。// ptr是一个指向整型变量x的指针常量。// ptr是一个指向整型变量x的常量指针。常量指针是一个指针,它指向的数据不能被修改,但是指针的值可以被修改。// 指向常量的指针,与ptr1等价。// 错误,不能修改指针常量的值。// 错误,不能修改ptr所指向的数据。// 指向常量的指针。// 可以修改指针的值。原创 2023-04-15 16:49:11 · 79 阅读 · 0 评论