- 博客(58)
- 收藏
- 关注
原创 C++---类型转换
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换 为另一种不同的类型。**向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) **static_cast用于非多态类型的转换(静态转换),标准C++为了加强类型转换的可视性,引入了。
2024-11-19 21:15:15
971
原创 C++---智能指针和内存泄露
其目的是为C++程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C++标准库共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用,根据该协议,商业或非商业的使用都是允许并鼓励的。**内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。**内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。**auto_ptr提供了拷贝,但是其拷贝是 管理权转移 **
2024-11-18 19:23:38
1175
原创 C++---异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家 随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了图解代码样例这里的样例其实就是上文中模拟服务器开发哪里的自定义异常体系public:, _id(id){}return _id;
2024-11-18 19:18:29
1053
原创 C++11(五)----lambda表达式
编译器根据[]来 判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda 函数使用。表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this)表示值传递方式捕获所有父作用域中的变量(包括this)使用mutable的时候,参数即使为空,也不能省略括号。表示引用传递捕捉所有父作用域中的变量(包括this)capture-list:捕捉列表。表示值传递方式捕捉当前的this指针。表示引用传递捕捉变量var。在不需要的时候可以省略不写。
2024-11-17 22:44:33
957
原创 C++11(四)---可变参数模板
emplace_back的功能和push_back一样。这里的参数包不是说能一下子push进去好几个数据,而是说当存储的数据为一个需要构造的时候,通过不断向下传这个参数包,使得可以直接构造出要push的数据,效率更高。
2024-11-17 22:42:32
726
原创 c++11(三)----新的类功能
即 没有自己实现移动赋值运算符重载且 析构函数,拷贝构造,拷贝赋值重载 都没有显示实现。即 没有自己实现移动构造函数且析构函数,拷贝构造,拷贝赋值 都没有显示实现。常常用于防止拷贝,上文中Person类无法进行拷贝构造了。c++11前,有6个默认成员函数。c++11后,还要添上。
2024-11-16 20:18:40
767
原创 C++11(二)---右值引用和移动语义
看了左值引用和右值引用的底层,那么在语法层上,想要右值引用引用左值,真的只能通过调用move吗?从这里看,左值引用和右值引用在底层实现上几乎没有区别,一个存储的是语法层上左值所在的地址;由于 模板实例化为右值引用时,右值引用的属性会退化成左值*(即 右值引用本身是左值)*,而我们想要传入的参数原本的属性。因为在右值引用出现前,已经可以用左值引用引用右值了,即用。左值引用可以给左值取别名,那么左值引用可以给右值取别名吗?右值引用可以给右值取别名,那么右值引用可以给左值取别名吗?右值引用是对右值进行引用。
2024-11-16 20:16:21
813
原创 c++11(一)
此处的Args&&并不是右值引用,因为这里是在类模板中,Args&&是万能引用,当传入为 左值时,这里是左值引用;date是通过一个由{2024,12,30}多参数构造出的临时对象拷贝构造出来的。这样的要求表明auto类型变量必须进行显示初始化,让编译器将定义的对象的类型设置为初始化值的类型。对于stl库的容器,提供initializer_list类型参数的构造函数,以实现列表初始化。的底层是一个静态数组,目的是为了弥补c语言在静态数组越界检查上的不足。是一个单向链表,支持头插,头删,不支持尾插,尾删。
2024-11-15 18:18:33
1047
原创 STL---unordered_set与unordered_map与前言(哈希表)
查找数据16,16的映射位置是6,从存储位置6开始向后线性探测,到存储位置7时,由于存储位置7的数据为空,那么会导致到7时停止,无法探测到存储位置8的16。此处扩容不使用线性探测法中扩容的方法,因为如果使用的话,在每次扩容时,都需要将之前的数据节点进行delete,然后重新new相同数量的节点,显然这种做法会使得插入的效率很低。查找时出现一个问题,当一个数据没删除,导致原本相连的数据出现了一个空白,而空白后的数据的映射位置在空白前的时候,如何才能找到该数据的位置。因此,一些采用开放定址法的hash库,
2024-10-31 22:21:40
903
原创 STL---map与set
容器分为序列式容器 和 关联式容器序列式容器: vector, list …。它们的是线性的关联式容器: map , set…。它们的数据的关联性很强。
2024-10-31 22:12:20
937
原创 STL---map与set前言(红黑树)
如何维护?当插入节点的父亲节点是黑色,那么直接就插入成功。当插入节点的父亲节点为红色时,我们将其分为两种情况:uncle存在且为红;uncle存在且为黑/uncle不存在如下图。
2024-10-29 13:41:18
862
原创 Windows API --- Unicode简介 2.1
对于Unicode的发展不再缀叙随着计算机的发展与不断普及,ASCII码已经不足以应对计算机全球化,因此Unicode编码应运而生。Unicode编码是16位,而ASCII码是8位,因此Unicode可以存储更多信息,以应对应对全球化并提供一个标准。另外一提 Unicode 被认为是“宽字符”,且Unicode只有一个字符集(因此避免了"二义性")。
2024-10-23 17:21:30
891
原创 Windows API ---起步 1.0
第一个参数:HINSTANCE类型的参数,称为“实例句柄" , 这个参数唯一标志了我们写的这个程序。HINSTANCE类型的参数,该参数也为句柄。该句柄在多路并发同一个程序的时候会被访问,通过hPrevInstance来判断是否有它的其他实例在运行,然后将前一个实例的数据搬过来,从而提高效率。不过已经是时代遗留下来的参数了,因为在32位windows机械下,该概念不再被采用,因此第二个参数的值为NULL即0。LPSTR类型的参数,这个参数是用来运行程序的命令行,当程序执行时用它来把文件装入内存。
2024-10-23 17:21:24
324
原创 操作系统 和 初识进程
由于 操作系统内核kernel 要进行 进程管理 ,进程管理 需要 进程的属性, 因此 操作系统 为了管理进程, 操作系统会在进程被加载到内存的同时 创建 PCB 来 描述 进程。, 每个PCB内存储了对应的进程属性, kernel 通过 进程的属性 来调控,调度 对应的进程 , 每个 PCB 链接起来,形成队列。手段: 通过对下的软硬件资源的管理,使软硬件资源 稳定的, 高效的 , 安全的 ,能进行良好的工作。目的: 操作系统对上要给用户提供一个稳定的,高效的,安全的运行环境。
2024-10-19 20:13:23
457
原创 Linux调试器-gdb 与 冯诺依曼体系结构
该变量会有一个对应的监视序号,该序号也是在一个调试周期中递增。为了 让其生成debug版本的可执行程序,可以加一个 -g 选项。【实际上在 函数名 的最开始的语句处打断点】查看所有断点的信息。断点的序号在一个调试周期中是递增的。版本会添加调试信息, release版本会取消调试信息。断点序号 + 条件 【这里没有if,直接写条件】程序发布有两种版本-debug和release。默认生成的可执行程序默认是release的。罗列10行,行号位置在罗列代码的中间位置。因此gdb只能对debug版本的进行调试。
2024-10-16 18:34:23
368
原创 Linux下的基本指令/命令(二)
但是符号>>输入重定向的文件是已有文件的话,会在文件后面进行写入,不会对之前内容进行覆盖。此处每次换行的原因不是符号>>的原因,而是 echo 在显示器文件中写入的时候自带了换行,因此输出重定向后,在重定向的文件中进行写入时也是自带了换行的。如果文件已经存在,每次写入都是从文件开头开始写,并对老的文件进行清空,然后再写入。实质上 在Linux下一切皆文件,管道也是文件,此处是 head -5020 log.txt的结果写入 管道文件中, 而后面的 tail -21 是对管道文件进行操作。
2024-09-26 22:08:38
1024
1
原创 Linux下的基本指令/命令(一)
选项: 可以创建一串路径,此处创建的路径上的文件都是目录。此处的 dir1/dir2/dir3/dir4 都是新创的目录, dir4目录在dir3目录下,dir3目录在dir2目录下,dir2目录在dir1目录下。注意: 正在运行的文件无法被删除。语法: ls【选项】【目录或者文件】 ls和【选项】,【选项】和【目录或者文件】之间有一个或者多个空格。默认打印的是目录中的文件(从目录的文件直到对应文件的叶节点)的详细信息。【不用-d选项的时候,对于查看目录文件,默认是查看目录文件里面的内容】
2024-09-26 00:13:17
1028
原创 Gitee基本指令操作
Git是免费且开源的。和 windows 同时使用, 会冲突,冲突解决pull,如果解决了同一个文件git不会覆盖,修改暴露出来,要程序员自己解决。提交日志” 真正把源文件提交到git仓库中,每次提交都会形成一个id值(称为)//此处的提交日志不能乱写。语法: 在 .gitignore 文件中 添加 *不想本地托管/上传的文件的后缀。用法: 将 不想 本地托管/上传的文件 的后缀添加到 .gitignore文件中。使得git的本地仓库和git的远端仓库进行合并。把文件添加到git中(git的暂存区)
2024-09-24 19:08:59
560
原创 gcc/g++的使用:
然后拿 汇编语言 来写一个 新的汇编编译器, 然后用 二进制编译器 , 编译形成一个全新的编译器。此处的libc.so.6 是 test 可执行程序 依赖的库。生成的文件的名字 源文件 , 也可以写为 gcc 源文件 -o 生成的文件的名字。是把源文件 进行编译,然后把 编译后的可执行程序 命名为 此处的可执行程序的名字。如下图,ls命令 也依赖 libc.so.6库,证明 ls命令也是c语言写的。静态连接的优点:不依赖其他库,即使库丢失也无所谓,照样可以运行。动态连接的优点: 比较节省资源。
2024-09-17 21:49:49
1130
原创 make 和 Makefile/makefile
当源文件的modify时间 大于 编译生成后的可执行程序的modify时间的时候,会对源文件进行重新编译, 当源文件的modify时间小于之前生成的可执行程序的modify时间的时候 不会对源文件的modify文件进行重新编译。如果想形成两个可执行程序, 那么 .PHONY: 一个伪目标,该伪目标的 依赖文件列表 是 两个未形成的依赖文件, 因此该依赖方法进栈, 然后 推导,直到推导到有依赖文件存在,然后逆向的执行所有的依赖方法。直到 推导到有依赖文件存在,然后再逆向的执行所有的依赖方法。
2024-09-16 23:38:21
1139
原创 list和vector的区别
list的迭代器不是随机迭代器,无法对迭代器进行 += , + , - , -= 等操作,因此list要使用sort只能使用自己的sort, 但是list进行sort排序的效率极低,甚至不如将数据拷贝到vector并用vector排好后再重新存到list中的效率。list的底层是 一个个节点链接起来的,自然是不连续的空间。list常常适用于 频繁进行头插,头删,且频繁对数据进行删除和插入的情形。list的迭代器是对节点的封装,vector的迭代器 本质上是 一个指针。
2024-09-14 20:49:49
294
原创 AVL树的模拟实现(插入,验证)
本文会先将AVL树的旋转进行讲解, 然后再对代码进行实现和展示。实际上AVL树的实现的难点在于 AVL树旋转,搞明白旋转,剩下的就明了了。
2024-09-11 23:24:59
484
原创 priority_queue模拟实现
priority_queue是一个适配器(适配器没有迭代器)。其底层是堆。可适配容器默认为vector。通过priority_queue的模拟实现的理解 仿函数 和 可适配容器
2024-09-10 19:49:05
363
原创 LeetCode 3.无重复字符的最长子串
请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。
2024-06-23 18:23:19
213
原创 LeetCode 209.长度最小的子数组
如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。的长度最小的 子数组。
2024-06-23 01:37:01
634
原创 LeetCode 19.删除链表的倒数第N个结点
遍历一遍得到节点个数N,然后再重新遍历,遍历时到 (N - n - 1)时,即得到要删除的节点的前一个节点。注意:当要删除的是第一个节点的时候,要进行单独处理和判断。即 (N - n - 1) < 0 时,是删除第一个节点,因此要对该情况进行单独讨论。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。
2024-06-21 22:49:10
539
原创 LeetCode 16.最接近的三数之和(C++)
先排序,使数据有序,以保证后续可以使用双指针来计算”三数之和“。记录第一次”三数之和“和target的距离(记为sub),并记录此时”三数之和“的值(记为ret)。当"三数之和“大于target时,比较此时"三数之和“和target的距离和sub的大小关系。当此时"三数之和“和target的距离
2024-06-21 22:27:39
606
原创 模板初阶.
的类型是 Stack<int> , st2的类型是Stack<double>。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型生成函数的特定版本。如果是并不是都是 int 类型 , 那么调用的是 此处的模板函数, 即通用加法函数。泛型编程: 编写与类型无关的通用代码,是代码复用的一种手段。其底层实际上调用的是编译器用模板生成的函数(这称为模板的实例化)。如果没有最匹配的函数,那么就调用能生成最匹配的函数的模板函数。参数的类型是根据传入的实参的类型进行推演得到的。
2024-04-22 07:56:35
418
原创 C&C++的内存管理
{2,4,5} 是 隐式转换 调用三个参数的构造函数 构造一个临时对象 , 再把临时对象拷贝 到 A[3] 中 , aa1 会拷贝构造到 A[4] 中 ,剩下的元素是直接 调用默认构造 构造出 对象。和delete是用户进行动态内存申请和释放的操作符,operator new 和 operator delete 是系统提供的全局函数, new在底层调用operator new 全局函数来申请空间,delete 在底层通过 operator delete 全局函数来释放空。它们都是在栈区存储的。
2024-04-20 12:19:47
997
原创 友元,const成员,static成员变量,static成员函数
如果要引用类型的话,应该是 const A& , 因为此处引用的实质上是 3 隐式转换 构造出的一个构造出的 类 为A 的临时对象, 而临时对象具有常性,因此要用const 修饰 A&。内部类和所在的类 都是 独立的类,内部类仅仅是放到所在的类的类域里面而已。的是把 3 隐式转换,先构造出一个 类为 A 的临时对象(调用的该类的构造函数,从而构造出的临时对象)。即没有算内部类B的大小, 这是因为B和A是两个独立的类,唯一的关系就是 B 放到了A的类域中 且 B类 天生就是 A类的 友元。
2024-04-18 21:30:02
498
原创 类和对象(中)
因为参数类型如果不是引用,而是类 类型的话,在传参时要调用拷贝构造,而拷贝构造的参数是类 类型,调用的时候传参需要调用拷贝构造,因此调用拷贝构造要调用拷贝构造,即形成无穷递归调用)即当函数的参数类型为 类 类型的时候,传参要调用该类的拷贝构造。因为拷贝过去后,两个对象指向了同一个空间,程序结束时,两个对象都调用了析构函数,对同一个空间销毁了两次,导致程序崩溃)若该类有显式的构造函数且对内置类型进行初始化,那么内置类型的成员是先走缺省值然后再进入构造函数中,对其进行初始化(实质上是覆盖)
2024-04-10 16:35:56
876
原创 初识内联函数,auto , 范围for , 类和对象
内联函数没有地址,这就导致当声明和定义在不同文件时,后续编译的时候,函数定义和函数声明无法链接,因此会出现链接错误,即编译过程中出现错误。因为c定义的时候,有的定义NULL为0,而不是指针类型,导致传参等等会出现问题,因此传空指针时更推荐传入nullptr。实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选 择性的将其接口提供给外部的用户使用。内联函数只是对编译器的一种建议,对于比较小的函数会进行展开,而长的函数就不会再展开,而是按照普通的函数进行执行。
2024-04-01 11:13:45
1013
原创 初入C++
如果传参,就用的传入的参数,不会在赋值为该常数。如果是全局域的函数名或者定义的变量名和命名空间定义的冲突。(命名空间域内的变量的生命周期是全局的,及不会出命名空间就销毁)是C++的ios流的库,输入输出的库。不同的文件可以使用同一个命名空间,这些文件的同一个命名空间域名的命名空间域会进行合并。展开命名空间是改变编译的默认查找原则,在函数局部域和全局域查找后还会在命名空间域查找。引用命名空间的变量或者函数时: 命名空间域的域名 : : 变量名(或者函数名)可以解决定义的变量名和库函数的函数名冲突的问题。
2024-03-27 17:05:33
597
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人