自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 模版进阶 非类型模版参数

原因是原模版中const修饰的T类型的内容 也就是指针指向的内容 而将const放在data*前面 则会修饰到指针 并没有修饰到指针指向的内容 所以要将data*放在const之前 让const修饰到指针指向的内容。这里的第三个比较使用的是指针 那么日期类的指针比较的大小不在是日期的的大小比较 而是变成了比较指针地址的大小 这是我们不想要的结果 这时就需要用到函数模版特化去解决。这里不仅可以特化普通的类型还可以特化指针和引用 指针中的特化是一个大类 其中的二级指针三级指针都可以使用这个大的特化类。

2024-10-10 19:56:43 554

原创 stack和queue priority_queue(二)(模拟实现)

与list比较,空间利用率比 较高。之后最大子节点与父节点进行比较 如果子节点更大那么交换位置 更新父节点位置 并确定新的左子节点位置并且重新比较 如果父节点大于子节点(建立大堆) 那么就可以停止 或者走到叶子节点也可以停止了 注意这里向下调整法中使用的类型是无符号类型。比较父节点与子节点的值 如果子节点的值比较大(这里实现的是大堆)那么交换父节点和子节点 之后 之后从子节点更新到父节点的位置 再次计算新的父节点位置再次进行比较大小 如果父节点大于孩子 则结束或者一直调整到根节点。

2024-09-21 20:15:38 716

原创 stack和queue(一)

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。empty是stack的成员函数 用于检测当前stack是否为空 返回布尔值 若为空返回真 不为空返回假。检测队列是否为空,是返回true,否则返回false。接下来建立一个栈并且完成栈的遍历。将stack中尾部的元素弹出。返回stack中元素的个数。返回队列中有效元素的个数。

2024-09-21 10:47:00 237

原创 list(二) (list模拟实现)

这里创立prev节点 和cur节点 指针 prev指向cur指向节点的prev指向节点 cur指向pos位置的节点 同时有newnode作为新插入节点的指针 首先prev节点的next指向newnode newnode节点的prev指向prev节点 newnode节点的next指向cur的结点 cur节点的prev 指向newnode节点。一个const迭代器 和一个普通的迭代器 两者之间非常的冗余 而且有很大的相似程度 这里我们可以用一个类来同时实现两个迭代器的功能。

2024-09-20 21:42:39 1134

原创 list(一)

list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。list的begin()指向头结点的下一个结点 也就是第一个有效元素的结点 end()指向头节点 也就是最后有效元素的下一个结点 rbegin()指向头结点 rend()指向头节点的下一个结点。这里使用的是第一个版本 将lsit容器x的全部元素插入 到 mylist1的pos位置 且此时链表二中被转移的内容是不会在存在在链表二的 相当于是转移。

2024-09-20 09:42:48 1335

原创 vector(二)vector模拟实现

这里在测试时可能会出现随机值问题 这是因为出现的pos迭代器失效的情况 原理是pos迭代器指向原本的空间 但是如果发生扩容 就会深拷贝 导致pos迭代器还是指向已经消失的空间 没有指向对应的新空间的对应位置上 解决方法 就是使用len记录pos在空间上距离_start的距离 之后在扩容结束后 使用新的_start对pos迭代器进行更新 这样就能 保证迭代器在函数体内正常使用。vector成员变量是三个迭代器 vector的迭代器底层与string相同是使用 指针实现的 使用的是类模版T*指针。

2024-09-10 21:42:08 650

原创 vetor(一)

string和vector<char>的底层非常相似 但是接口不同 如append +=这样的接口vector是没有的。sort是存在algorithm库中的 它是一个函数模版 它的参数传的是函数的迭代器。string是专门针对字符串数组设计的 而vector是根据所有类型设计的 两者不相同。vector的begin是指向数组的第一个元素 而end是指向数组最后一个元素的下一个。而vector容器是通过迭代器确定范围 返回的也是对应位置的迭代器。这里数组使用指针确定范围 同时返回的是对应位置的指针。

2024-09-10 09:45:26 790

原创 string(三)

这里的iterator 利用的是char*指针 begin和end分别返回字符串数组首元素和有效元素最后一位的下一位 []的参数是下标 返回的值的对应数组下标位置中的内容 []不仅可以访问内容也可以进行修改。这里是string的构造 这里的初始化列表与代码块一起使用来进行初始化 初始化列表的初始化顺序是按照私有成员的创建顺序进行的 和这里的顺序无关。而插入位置是任意的 所以可能需要挪动字符 为插入的内容腾出空间 而挪动字符位置的方式有两种。

2024-09-09 23:08:13 450

原创 string笔记(二)

除了用三个参数来插入字符之外 还有一种版本 第一个参数放入的是要插入的位置 不过不是用下标而是使用迭代器中的begin()成员函数来代替下标表示位置 第二个参数则放入将要插入的字符内容。想要插入或者头插一个字符用上述的两个参数是行不通的 需要三个参数 第一个依旧是位置下标 第二个是要插入字符的数量 第三个是要插入的字符。replace有三个参数 第一个参数是提供下标位置 第二个参数是要从当前位置之后开始替换的长度 第三个是要替换的内容。而两个参数的版本不仅可以修改size还可以对内容进行统一的初始化。

2024-09-03 21:28:30 633

原创 string笔记(一)

C语言中的字符串 C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP(面向对象编程)的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。那么为什么会有两个 相同功能的 这是string比stl先出 当时string用的是length 但后来stl出现后 又统一设立了size 所以size在stl中时通用的 而length则是string中独有的。

2024-09-02 23:07:20 592

原创 c++ new delete 模版

在空间上执行析构函数,完成对象中资源的清理工作。在申请空间失败时会抛异常, malloc会返回。在申请的空间上执行构造函数,完成对象的构造。解决add(a1,d1)中就有用到显式实例化。申请和 释放的是单个元素的空间,new[]类模板实例化与函数模板实例化不同,如果申请的是内置类型的空间,模版分为函数模版和类模版。申请的是连续空间,而且。在释放的对象空间上执行。,对于模板函数的使用,,对于字符类型也是如此。,注意:匹配起来使用。

2024-07-15 11:17:00 577

原创 类和对象+内存管理 4.18

(2).num1中有十个为int的空间 所以10*4 = 40 char2中除了abcd外还有斜杠0 所以有5个char大小的空间 所以是5*1=5 char2的长度是指abcd所以是4 pChar3是int指针 所以其sizeof大小是4 pChar3指向abcd 所以strlen的长度也是4 ptr1也是int指针 所以sizeof大小也是4()ptr1是局部 所以也处于栈中 而ptr1指正指向的空间是通过malloc出来的 malloc出来的空间是在堆中的 所以*ptr1在堆中。

2024-05-24 16:28:34 715

原创 新手c++之类和对象(下)4.16

内部类是一个独立的类,它不属于外 部类,更不能通过外部类的对象去访问内部类的成员。(两者是类似于平行的关系) 注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中 的所有成员。但是外部类不是内部类的友元。在这里的初始化列表本质就相当于每个对象中成员定义的地方 而我们的const修饰的常变量是不可改变的 而引用的变量是需要进行初始化的 且const变量只有一次初始化的机会 ,就是在定义的时候,所以const常变量和引用变量初始化都是必须通过初始化列表的。

2024-05-20 23:12:39 748

原创 新手c++之类和对象(中)2

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。总结一下:返回对象是一个局部对象或者临时对象,出了当前func函数作用域,就析构销毁了,那么不能用引用返回用引用返回是存在风险的,因为引用对象在func函数栈帧已经销毁了。且这时在随便调用一个函数后 ref的会发生修改 原因是引用返回时的内容已经被析构 这里接受func函数的ref相当于为空 当在出现新的函数调用会把ref进行覆盖。

2024-05-06 15:12:02 712

原创 新手c++之类与对象(中)

系统默认生成的无参的构造函数和无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。在这个myqueue中 s1 和s2是自定义类型 会去调用相对应自定义类型的构造和析构 而_size是内置类型 而且没有资源需要清理 所以myqueue类型中不需要去主动定义析构函数。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。在上图中如果没有写析构函数 系统自动生成的默认析构是不会去清理_array 的空间的 这时就会发生内存泄漏 这是非常可怕的 内存泄漏是不会报错的。

2024-05-05 03:18:37 552 2

原创 新手c++之类与对象笔记(上)

那是因为在类的实例化时 每个对象的成员变量都会开独自的空间 而成员函数是放在公共空间的 是不会在每个对象中都存放一个成员函数的(每个对象都放成员函数会造成浪费)这里的计算时的成员变量时所有的 不论是在公共的 还是私有的都会参与计算。而如果不对齐 可能会进行多次访问 在上图中右边的不对齐中 第一次读取4个字节 会读到_ch和_i的三个字节 之后还要在读取_i的剩下的一个字节空间和三个空白空间 这样就造成不必要的浪费 而且读取下来 还要进行裁剪和拼接才能读取到正确的内容。的操作,都是通过该指针去访问。

2024-04-25 22:55:54 696 1

原创 新手C++之函数重载 引用 内联函数

在上图编译中在.i .s .o 文件中都是没有函数定义的 只存在函数声明 原因是编译开始时 .h头文件和.cpp源文件是分开编译的 在没有链接之前 .cpp的源文件的机械码中只有只有声明 没有定义 这是是不会通过call和jump跳到 函数定义的 只有链接后 才会存在函数定义 若在链接后只有函数声明 而没有找到函数定义 这时产生无法解析的外部符号错误 这种错误是链接错误 (编译错误是指语法出现一些问题)这里是不会报错的 这不是权限的放大 是通过x的拷贝给p p的修改不会影响到x的。int &b= a;

2024-04-23 09:43:34 486

原创 新手c++入门之命名空间

那么我们在展开空间时 与外界的同名的变量 函数等可能会产生冲突吗 答案是不怕的 我们会按照默认的顺序去寻找 而且同名的变量在是局部域使用的会在使用其功能时也会智能使用局部域中的功能 使用命名空间域中的定义时也会智能的从命名空间域中去使用操作其功能。也就是说我们得到了张大爷的允许 我们可以进入张大爷的菜地中摘菜了 而全部展开就相当于我们可以摘张大爷家的所有种类的菜 而指定展开就相当于我们只能摘张大爷家的指定展开的菜 而菜地中的其他菜我们依旧是不能采摘的。答案是不会的 应该相同的命名空间会默认自动发生合并。

2024-04-15 13:10:57 747 1

原创 简易贪吃蛇代码

实现吃食物功能 需要通过头插法将食物结点插入蛇的链表中 然后将整个新的蛇身再次打印 这是创建一个cur结点 cur开始在蛇头结点位置通过while循环和setpos wprintf函数依次打印 之后删除free旧的食物结点 通过 createfood函数再次创建一个新的食物结点 之后 将食物的分数加入到所得的游戏总分上面。在snakeend函数中首先要根据蛇的结束状态通过Switch语句来选择不同的结束语 写出不同的结束游戏的原因 之后将创建的贪吃蛇的空间全部free掉 并置为空。

2024-02-26 23:01:15 1311 1

原创 C语言程序编译和链接

这里需要注意的是多个.c⽂件单独经过编译出编译处理⽣产对应的⽬标⽂件 Windows环境下的⽬标⽂件的后缀是 .obj ,Linux环境下⽬标⽂件的后缀是 .o 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。源1 中有一个ADD函数 而源2文件中有ADD函数的外部声明和main主函数. 源2文件中的ADD虽然也会有一个地址 但属于无效地址 在符号决议中会从源1文件中ADD的有效地址代替源2中的无效地址 实现重定位。语义分析 对内容通过语义分析器进行语义分析 可以将内容的语法错误进行报告。

2024-01-19 22:12:04 769 1

原创 扫雷游戏代码

conuts是用来提示玩家周围排查位置周围8个位置有几个雷的信息 由于函数是int类型 所以返回也需要是int类型 而在初始化和布置雷时所用的都是字符‘0’和‘1’所以需要转换 通过‘4’-‘0’=4 ‘5’=5+‘0’可以通过加减‘0’来得到想要的类型是字符还是整型。setplay用来布置雷 利用提前定义好的雷数作为循环判断条件 每成功放置一个雷 雷数就-1当未布置雷数为0时循环结束 同时内部通过rand()来随机坐标布置雷%9+1使范围控制在下标1到9中if条件用来放置重复一个位置布置雷。

2023-10-30 19:01:27 64

原创 分支和循环

这两个例子是等价的 在判断表达式1不成立直接结束 表达式1成立则执行判断表达式2 表达式2成立执行语句1 表达式2不成立执行语句2 其中else 和if 会寻找最相近的对方进行匹配 要解决else悬空就要用到{}把需要的内容括起来。判断表达式1 表达式1成立执行判断表达式2 执行语句1 表达式2不成立执行语句2 若表达式1不成立则会直接结束。当表达式1不成立时不会执行if表达式2 当表达式1成立时执行判断表达式2 表达式2成立执行语句1。exp3)表达式1为真 进行表达式2 并将2作为结果。

2023-10-28 09:45:07 48 1

原创 如何在vs编译器中使用scanf而不是scanf_s

第三步 打开方式选择记事本 就可以打开修改 修改完成后 保存再将newc++file.cpp文件放回到原来的位置 这是打开vs编译器新建源文件就会在第一行自动出现#define _CRT_SECURE_NO_WARNINGS这句话。3.由于vs编译器创建源文件是以一个newc++file.cpp的一个文件为模板的 因此只要在这个文件中加入#define _CRT_SECURE_NO_WARNINGS在创建源文件是就会自带这句话。正确的安装路径是visual studio\2022的那个。

2023-10-14 12:15:43 709 5

原创 我的第一篇博客

1. 我是在校计算机科学与技术(师范类)系的大二学生 平时喜欢看一些手工类教程视频 喜欢看历史 喜欢读一些的国家总统 各种名人的人物传记 性格是较内向 自卑 但是我内心坚韧 能够承受很大压力。2.对于编程的目标 我希望在校园中能够学习到很好的技术来为未来就业做准备 在校期间希望能参加蓝桥杯之类的个人竞赛获得一些成就 增加一些自己简历内容。4.在校园除了必要的课程学习外 在满足自己的休闲世界外 剩下的时间都用在编程上 一周大概21小时。5.暂时没有,工资越高越好。

2023-10-12 16:54:30 35

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除