C/C++学习笔记
文章平均质量分 77
C/C++学习笔记
Zhang丶&|!
这个作者很懒,什么都没留下…
展开
-
(C++进阶)boost库笔记
boost::function 是 Boost 库中提供的一个通用函数对象包装器,它可以存储指向任何可调用对象的指针,并且可以在任何时候通过 operator() 调用。这个功能类似于C++11及以后版本中的 std::function。使用 boost::function 的主要好处是可以创建类型安全的函数指针容器,可以接受不同类型的函数、成员函数、lambda 表达式或仿函数(functor)作为参数,方便在算法和数据结构中传递可调用实体。原创 2024-03-14 11:23:47 · 564 阅读 · 0 评论 -
(C++进阶)使用Eigen库进行多项式曲线拟合
Eigen是一个C++模板库,专门用于线性代数运算。它提供了矩阵、向量操作和线性代数算法所需的功能,且采用头文件形式,易于集成到C++项目中。原创 2023-11-09 10:48:24 · 2942 阅读 · 1 评论 -
(C++进阶)正则表达式
正则表达式(Regular Expression),通常简写为RegExp或Regex是一种用于匹配字符串模式的强大工具。它由一系列字符和特殊符号组成,用于定义匹配模式。正则表达式在文本处理、数据验证、搜索和替换等领域有广泛的应用。原创 2023-10-24 10:31:13 · 972 阅读 · 0 评论 -
设计模式--工厂模式
①客户端和具体实现类解耦。②对于某些创建对象过程复杂的类,我们也不用考虑。原创 2023-08-01 10:59:54 · 264 阅读 · 0 评论 -
(C++)知识点补充
用于在函数声明中指示该函数不会抛出异常,如果函数内部发生了异常,则会调用std::terminate()函数来终止程序的执行。在一个元素内,早期的标准是支持十个以内,而在。的扩充,可以支持更多的。以后,可以支持更多的。原创 2023-07-18 10:39:05 · 263 阅读 · 0 评论 -
(C++进阶)类型转换
每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。隐式类型转化有些情况下可能会出问题:比如数据精度丢失。显式类型转换将所有情况混合在一起,代码不够清晰。显式类型转化:需要用户自己处理。提出了自己的类型转化风格,注意。原创 2022-08-22 10:57:08 · 127 阅读 · 0 评论 -
(C++进阶) 智能指针
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。2、内存泄漏的危害长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。3、内存泄漏分类3.1 堆内存泄漏堆内存指的是程序执行中依据须要分配通过等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete删掉。原创 2022-08-21 10:37:29 · 131 阅读 · 0 评论 -
(C++进阶) 异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch。返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误。标准库的异常体系定义得不好,导致大家各自定义各自的异常体系,非常的混乱。原创 2022-08-20 09:52:53 · 204 阅读 · 0 评论 -
(C++进阶) C++11
2、多个对象想要支持列表初始化,原创 2022-08-18 12:49:19 · 1224 阅读 · 0 评论 -
(C++进阶)设计特殊类
目录1 只能在堆上创建对象的类1.1 实现方式1.2 实现2 只能在栈上创建对象的类2.1 实现方法2.2 实现2.3 屏蔽new方法实现3 不能被拷贝的类3.1 C++983.1.1实现3.2 c++113.2.1 实现4 不能被继承的类4.1 c++984.2 c++115 只能创建一个对象的类(单例模式)5.1 设计模式5.2 单例模式5.2.1 饿汉模式5.2.2 懒汉模式5.2.3 懒汉模式与饿汉模式的对比2 只能在栈上创建对象的类2.1 实现方法将构造函数私有化,然后设计静态方法创原创 2022-08-12 17:34:37 · 101 阅读 · 0 评论 -
(C++ 进阶) 红黑树
②如果u节点存在,则其一定是黑色的,那么cur节点原来的颜色一定是黑色的,现在看到其是红色的原因是因为cur的子树在调整的过程中将cur节点的颜色由黑色改成红色。①如果u节点不存在,则cur一定是新插入节点,因为如果cur不是新插入节点,则cur和p一定有一个节点的颜色是黑色,不满足每条路径黑色节点个数相同。p为g的左孩子,cur为p的右孩子,则针对p做左单旋转;(1)cur为红,p为红,g为黑,u不存在/u为黑。cur为红,p为红,g为黑,u不存在/u为黑。则转换为情况二进行处理。...原创 2022-07-25 16:37:40 · 315 阅读 · 0 评论 -
(C++ 进阶)AVL树(高度平衡二叉搜索树)
,即可降低树的高度,从而减少平均搜索长度。一棵AVL。原创 2022-07-22 21:31:19 · 335 阅读 · 0 评论 -
(C++ 进阶)map & set
multimap和map的区别①map中的key是唯一的,而multimap中key是可以重复的。map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。中的元素不允许修改,因为Value就是它的键,随意修改会破坏树的结构。)作为其底层结构,容器中的元素是一个有序的序列。容器慢,但它们允许根据顺序对子集进行直接迭代。中的元素进行迭代时,可以得到一个有序的序列。来存储数据,与序列式容器不同的是,其。,但是可以从容器中插入或删除它们。中的元素,可以得到有序序列。...原创 2022-07-22 15:08:44 · 570 阅读 · 0 评论 -
(C++进阶)二叉搜索树 (K KV)
个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树。③如果根节点key>查找key,在其左子树查找。如果根节点key...原创 2022-07-22 11:53:55 · 588 阅读 · 0 评论 -
(C++进阶) 多态
目录1. 多态的概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的两个例外2.4 C++11 override 和 fifinal2.5 重载、覆盖(重写)、隐藏(重定义)的对比2.6 多态示例3. 抽象类3.1 概念3.2 接口继承和实现继承4. 多态的原理4.1 虚函数表4.2 多态原理总结4.3 动态绑定与静态绑定5. 单继承和多继承关系中的虚函数表5.1 单继承中的虚函数表5.2 多继承中的虚函数表(1)多态是不同继承关系的类对象,去调用同一函数原创 2022-07-10 23:10:08 · 406 阅读 · 0 评论 -
(C++进阶)继承
目录1.继承的概念及定义1.1继承的概念1.1.1 示例1.2 继承基类成员访问方式的变化1.2.1 权限不能放大,只能缩小1.2.2 总结:2.基类和派生类对象赋值转换2.1 概念2.2 示例3.继承中的作用域3.1 概念3.2 示例4.派生类的默认成员函数5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承7.1 单继承7.3 菱形继承7.4 菱形继承问题的解决办法7.5 虚拟继承解决数据冗余和二义性的原理8.继承和组合9.复习重点1.2 继承基类成员访问方式的变化 1.2.1 权原创 2022-07-10 17:09:24 · 144 阅读 · 0 评论 -
(C++初阶) 栈和队列
目录一 栈1 栈的基本概念2 栈的简单使用2.1 栈的接口2.2 简单使用3 用vector模拟实现stack二 队列1 队列的基本概念2 栈的简单使用2.1 接口2.2 简单使用3 用list模拟实现queue三 优先级队列1 优先级队列的基本概念2 优先级队列的使用2.1 接口2.2 简单使用四 容器适配器1 适配器的概念2 STL标准库中stack和queue的底层结构3 deque3.1 deque的缺陷3.2 为什么选择deque作为stack和queue的底层默认容器2.1.1 来源(cplu原创 2022-07-10 11:22:21 · 398 阅读 · 0 评论 -
(C++初阶) IO流
目录一 C语言的输入与输出二 流1 流是什么2 流的特性三 C++IO流1 输入输出流库1.1 输入/输出流库(来源cplusplus)2 C++标准IO流3 C++文件IO流四 stringstream的简单介绍1 将一个整形变量的数据转化为字符串格式(C)2 stringstream作用2.1 将数值类型数据格式化为字符串2.2 字符串拼接2.3 总结“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bit,byte,packet )的抽象描述。 C原创 2022-07-10 12:04:41 · 226 阅读 · 0 评论 -
(C++初阶) 模板进阶
目录一 非类型模板参数1 类型形参与非类型形参2 注意3 举例二 模板的特化1 概念2 函数模板特化3 类模板特化3.1 全特化3.2 偏特化三 模板分离编译1 什么是分离编译2 模板的分离编译四 模板总结1 优点2 缺陷3 类模板特化3.1 全特化 全特化即是将模板参数列表中所有的参数都确定化。3.1.1 举例3.2 偏特化 偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。3.2.1 部分特化:将模板参数类表中的一部分参数特化。原创 2022-07-08 19:08:23 · 283 阅读 · 0 评论 -
(C++初阶) list的基本使用与模拟实现
目录一 知识点总结二 list的基本使用1.list遍历方式2.list排序(不推荐)3.list数据操作三 list 模拟实现1 List.h2 List.cpp1.原生指针可以当做天然迭代器使用。其实vector/string 的迭代器就是原生指针。但是,如list物理空间不连续的容器,使用原生指针就已经无法完成迭代器的功能了,所以就需要用迭代器去封装list的节点指针node*,重载这个类的* ++ 等运算符,去模拟指针的访问行为。2.迭代器的作用:可以让我们不用在意容器的底层结构到底是数组、链表、树原创 2022-07-05 13:16:00 · 1979 阅读 · 0 评论 -
(C++初阶) Vector的使用
目录1 vector的数据插入和3种遍历方式2 打印vctor(函数模板 泛型)3 vector的初始化相关4 vector的任意位置插入与删除5 swap6 总结2 打印vctor(函数模板 泛型)3 vector的初始化相关4 vector的任意位置插入与删除(尽量少用insert和erase,需要挪动数据,效率低)5 swap6 总结6.1 在vector遍历时,下标+[ ],简单好用,但是我们也得掌握迭代器,迭代器才是容器通用的访问方式。6.2 in原创 2022-07-03 19:52:14 · 575 阅读 · 0 评论 -
(C++初阶) string 类的模拟实现
①拷贝构造和赋值重载实现深拷贝。②增删查改的相关接口(和顺序表类似)。③重载的一些常见运算符。如:>、原创 2022-07-02 22:39:15 · 499 阅读 · 0 评论 -
(C++初阶) string类
目录一 标准库中的string类1 string类相关概念2 string类的常用接口1 string类对象的常见构造2 string类对象的容量操作3 string类对象的访问及遍历操作4. string类对象的修改操作5 string类非成员函数6 string深浅拷贝与赋值重构2 string类对象的容量操作 ①size,返回字符串有效字符长度 ②length ,返回字符串有效字符长度 ③capacity ,返回空间总大小 ④empty ,检测字符串释放为空串,是返回tr原创 2022-07-02 13:39:44 · 109 阅读 · 0 评论 -
(C++初阶) 初识STL
目录一 STL 简介1. 什么是STL2. STL的版本3. STL的六大组件4. STL的重要性5.STL的缺陷3.1 容器①string ②vector ③list ④deque ⑤map ⑥set ⑦multimap ⑧multiset3.2 算法①find ②swap ③reverse ④sort ⑤merge ......3.3 迭代器①iterator ② const_iterator ③ reverse_iterator ④const_reverse_iterator3.4 配接器① stac原创 2022-06-29 19:13:41 · 131 阅读 · 0 评论 -
(C++初阶)模板初阶
目录一 泛型编程1 概念:二 函数模板1 函数模板概念2 函数模板格式3 示例三 类模板1 类模板的定义格式三 类模板1 类模板的定义格式原创 2022-06-29 13:07:13 · 83 阅读 · 0 评论 -
(C++初阶) C/C++内存管理
目录1. C/C++内存分布1.1 总结2. C语言中动态内存管理方式2.1 malloc/calloc/realloc和free2.2 malloc/calloc/realloc的区别3. C++中动态内存管理3.1 概念:3.2 new delete 与malloc free 的区别3.3 示例4. operator new与operator delete函数4.1 概念5. new和delete的实现原理5.1 内置类型5.2 自定义类型6. 定位new表达式(placement-new)6.1 概念原创 2022-06-29 11:03:52 · 266 阅读 · 0 评论 -
(C++初阶) 类&对象 三
目录1.友元1.1 概念:1.2友元函数:1.3友元类1.4 友元总结2 再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字3 static成员3.1 概念:3.2 特征4 C++11 的成员初始化新玩法4.1 赋缺省值4.2 示例5 内部类5.1概念及特性5.2 示例6 再次理解封装友元分为友元函数和友元类 。友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。 1.2.1 问题:现在我们尝试去重载operator...原创 2022-06-27 17:03:23 · 443 阅读 · 0 评论 -
(C++初阶)类&对象 二
目录1. 类的6个默认成员函数2. 构造函数3. 析构函数4. 拷贝构造函数5. 赋值操作符重载6. 日期类的实现7. const成员函数8. 取地址及const取地址操作符重载2.5 例3. 析构函数 3.1 概念:析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。3.2 特性:析构函数是特殊的成员函数。 1. 析构函数名是在类名前加上字符 ~。 2.原创 2022-06-26 17:53:31 · 188 阅读 · 0 评论 -
(C++初阶)类&对象 一
目录1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装5 封装6 类的作用域7 类的实例化8 结构体内存对齐规则9 隐含的this指针1.1 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。(下单、接单、送餐)。1.2 C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。(客户、商家、骑手)2.1 C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。2.2 C++原创 2022-06-25 19:08:28 · 129 阅读 · 0 评论 -
(C++初阶) 入门
目录一 C++关键字1. C++98:二 命名空间1. 命名空间的基本概念2.namespace关键字的使用三 C++输入&输出1.C++输入&输出基本信息2.具体使用四 缺省参数1.缺省参数的概念2.例五 函数重载1.概念:2.举例3.extern “C”六 引用1.概念:2.举例七 内联函数1. 内联函数概念:2.特性:八 auto关键字(C++11)1.概念:2.auto不能推导的场景九 基于范围的for循环(C++11)1.概念:2.范围for的使用条件十 指针空值---nullptr(C++11)原创 2022-06-25 13:09:27 · 363 阅读 · 0 评论 -
(数据结构初阶) 排序
目录1 直接插入排序2 希尔排序3 直接选择排序4 堆排序5 冒泡排序6 快速排序7 归并排序8 计数排序9 总结1.1 概念:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 1.2 实现:1.3总结 ①元素集合越接近有序,直接插入排序算法的时间效率越高 。②时间复杂度:O(N^2)。③ 空间复杂度:O(1),它是一种稳定的排序算法。④稳定性:稳定2.1 概念:希尔排序法又称缩小原创 2022-06-23 22:08:03 · 270 阅读 · 0 评论 -
(数据结构初阶)二叉树 (二)
目录一 树的链式存储结构二 树的链式结构简单实现1.基本结构2.结点创建3.前中后序遍历为深度优先遍历,层序遍历为广度优先遍历4.求结点个数5.求叶子结点个数6.求第K层结点个数7.查找树里面值为x的那个结点8.销毁树9.判断一棵树是不是完全二叉树三 完整文件1.BinaryTree.h2.BinaryTree.c3.test.c1.四种遍历顺序:前序遍历(先根)、中序遍历(中根)、后序遍历(后根)、层序遍历。2.递归:①子问题。②结束条件。3.排序二叉树:①又称二叉搜索树,它的左孩子都小于父亲,右孩子都大原创 2022-06-21 17:21:41 · 163 阅读 · 0 评论 -
(数据结构初阶)二叉树 (一)
目录一 树的概念与结构二 二叉树的概念与结构1 二叉树的概念:2 二叉树的性质:3 树的存储结构三 堆1 堆的基本性质2 向下调整算法3 建堆4 堆排序 O(N*logN)5 堆的实现(封装)6 TOPK问题1 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点,除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm原创 2022-06-20 18:55:50 · 381 阅读 · 0 评论 -
(数据结构初阶)栈和队列
目录一 栈1.栈的基本概念(1)栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 (2)压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。(3)出栈:栈的删除操作叫做出栈。出数据也在栈顶。 (4)栈的实现:一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。2.栈的核心接口代码实现(1)基本结构(2)初始原创 2022-06-19 12:48:04 · 264 阅读 · 0 评论 -
(数据结构初阶)时间复杂度与空间复杂度
1.算法中的基本操作的执行次数,为算法的时间复杂度。使用大O的渐进表示法 :估算。2.在实际中一般情况关注的是算法的最坏运行情况,所以时间复杂度为取最大的。3.基本操作递归了N次,时间复杂度为O(N)。 4.现基本操作递归了2^N次,时间复杂度为O(2^N)。1.空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。2.递归的原创 2022-06-04 15:16:17 · 322 阅读 · 0 评论 -
(C语言)函数栈帧&可变参数列表&命令行参数
1.认识相关寄存器eax:通用寄存器,保存临时数据,常用于返回值。ebx:通用寄存器,保存临时数据。ebp:栈底寄存器。esp: 栈顶寄存器。eip: 指令寄存器,保存当前指令的下一条指令的地址。2.认识相关汇编命令mov: 数据转移指令push: 数据入栈,同时esp栈顶寄存器也要发生改变。pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变。sub:减法命令。add: 加法命令。call:函数调用,①压入返回地址。②转入目标函数。jump:通过修改eip,转入目标函数,进行调用。ret:恢复返回原创 2022-06-02 22:42:39 · 134 阅读 · 0 评论 -
(C语言) 内存管理
1.内存泄漏问题:如果程序退出,会自动解决,因为申请的空间是在堆上申请的。2.3.为什么要有动态内存:1. 在技术方面,普通的空间申请,都是在全局或者栈区,全局一般不太建议大量使用,而栈空间有限,那么如果一个应用需要大量的内存空间的时候,需要通过申请堆空间来支持基本业务。2. 在应用方面,程序员很难一次预估好自己总共需要花费多大的空间。想想之前我们定义的所有数组,因为其语法约 束,我们必须得明确"指出"空间大小.但是如果用动态内存申请(malloc),因为malloc是函数,而函数就可以传参,也就意味着,我原创 2022-06-01 21:29:18 · 401 阅读 · 0 评论 -
(C语言)指针与数组
1.在同类型情况下,对指针解引用,代表指针所指向得目标,对1级指针加1,其实是加上其所指向得类型得大小。对2级及以上指针加1,其实是加上指针的大小,32位系统下加4,64位下加8.2.数组传参发生降维,降维成指向数组内部元素类型的指针,,如果不降维,就要发生数组拷贝,使得函数的调用效率降低。3.在C中,任何函数调用,只要有形参实列化,就会形成临时拷贝。C是面向过程语言,函数核心概念,定义与调用函数,传参;数组,数组传参,为了效率发生降维。数组元素个数是数组类型的一部分。4.强制类型转换只是改变看待数据的方式原创 2022-06-01 12:54:54 · 127 阅读 · 0 评论 -
(C语言) 操作符&预处理
扩展:1.回车\r:光标回到当前行的最开始。换行\r:光标移动到下一行。2.C99规定,’a‘叫做整形字符常量,被看成int型。3.健壮性:系统在不正常输入情况下仍能表现正常的程度。4.取整:C中默认向0取整,floor(向-∞取整);trunc(向0取整);ceil(向+∞取整);round(四舍五入)。取余:尽可能让商向0取整;取模:尽可能让商向-∞取整;(a=q*d+r)5.宏定义字符串一定要带上“ ”。6.预处理:文本式代码转为二进制代码称为翻译。①预处理-E:头文件展开、去原创 2022-05-29 23:51:57 · 70 阅读 · 0 评论 -
(C语言)32个关键字
概要数据类型关键字(12个) char : 声明字符型变量或函数 short :声明短整型变量或函数 int :声明整型变量或函数 long :声明长整型变量或函数 signed :声明有符号类型变量或函数 unsigned :声明无符号类型变量或函数 float :声明浮点型变量或函数 double :声明双精度变量或函数 struct :声明结构体变量或函数 union :声明共用体(联合体)数据类型 enum原创 2022-05-28 21:25:28 · 2595 阅读 · 0 评论