- 博客(30)
- 收藏
- 关注
原创 C++STL: vector容器
是一个定义在 C++标准模板库(STL)中的标准容器,是最常用的容器之一。本质上,是一个动态数组,当容量不足时会自动向外进行拓展,并提供了强大的功能来操作其存储的元素。 同时,得益于c++强大的模板功能,其可以存储任意类型的元素,包括基础数据类型,类类型,以及用户自定义的数据类型!容器因为连续内存布局的缘由,对于随机访问以及插入与删除操作(仅在尾部)的性能为常数时间复杂度 O(1)。其余情况下操作均为线性时间复杂度 O(n)。容器包含在<vector>头文件中,以下是该容器的一个简单运用示例:支持的
2025-01-24 14:23:06
1027
原创 C++11新特性:aligned_storage等空间分配工具
这不仅会导致 B 的数据部分超出 storage 范围,产生内存溢出,同时,如果 flag 的地址不满足 B 的对齐需求,可能会触发未定义行为,而且,A 和 B 同时存在,析构时如果 A 和 B 的内存范围重叠,析构函数可能破坏彼此的数据。为了避免内存重叠的问题std::aligned_union 分配的内存块通常只用于存储一个对象。该工具可用于在内存池中向用户分配内存块。
2025-01-13 21:25:25
640
原创 C++内存对齐
在计算机中,内存是按照字节进行地址寻址的,每个字节都有一个唯一的内存地址。但是,当处理器从内存中读取数据时,它通常会以块的形式进行读取,而不是一个字节一个字节地读取。这种块的大小通常是4 字节(32 位系统)或8 字节(64 位系统)。倘若在读取的时候,数据跨越了内存块边界, CPU 需要额外的读取操作,从而降低了性能。为了提高内存访问的效率,编译器和处理器会按照一定的规则对齐数据:即将数据以特定的方式存储在内存中,使其地址满足特定的寻址要求。
2024-12-10 16:23:17
905
原创 Qt几何数据类型:QLine类型详解(基础向)
这里需要注意的是:默认构造出来的是一个起始与终止点都在原点的Null线段,但是空值线段并不是只有首尾都位于原点的点。是 Qt 提供的一个简单的几何类,适用于整数精度的线段表示,用于表示二维空间中的直线段。的值很大,它们的和可能会超过数据类型的最大值,从而导致溢出。如果返回的值为负数,说明线段是从上向下延伸的。该方法同样用于设置一条线段的起点与终点,与上述是一样的。至此,QLine类的方法就说完了,QLineF大部分方法与QLine是一致的。对象,它不会修改原线段的值,而是返回一个新的线段。
2024-12-03 17:01:10
1146
原创 C/C++ assert断言详解
在C/C++中,assert是一种用于调试的宏,主要用于验证程序中的某些假设条件是否成立。如果条件不成立,assert会中断程序的执行,并输出相关信息,帮助开发者定位问题。assert是动态断言,在程序运行期进行条件检查,C++11中引入了静态断言用于编译期进行条件检查。下面我们围绕这两点进行展开。C语言中,assert宏的原型定义在中,而在C++中则定义在中。虽然二者头文件名称不同,但它们的功能都是相同的。但是
2024-12-03 16:16:47
1346
原创 Qt几何数据类型:QPoint类型详解(基础向)
虽然 Qt 有自己的图形和绘图 API,但是有些开发者可能需要使用 Core Graphics 框架的特定功能,而且有的第三方库可能使用的是CGPoint类型的坐标点。用一个简单的例子来说:假如你在城市街道中从一个十字路口走到另一个十字路口,你只能沿街道的直线方向(横或竖)行走,不能直接穿过建筑物。曼哈顿距离特别适合在网格状空间或离散的环境中使用,它的名称来源于曼哈顿市的街道布局,因为它模拟了在城市的直角网格街道中,从一个点到另一个点的最短路径。但是欧几里得距离的计算涉及平方与开平方,计算效率是比较低的。
2024-11-28 19:31:53
1385
原创 C++11新特性:万字详解智能指针-unique_ptr篇
横向对比auto_ptr与unique_ptr之间差异,其中之一便是unique_ptr可以由用户自己提供自定义的删除器,而auto_ptr则不支持该功能,这也是auto_ptr淘汰的原因之一。为什么删除器如此重要?删除器(Deleter)是智能指针用来管理资源销毁方式的。默认情况下,智能指针会使用标准的 delete 或 delete[] 运算符来释放所持有的资源。但在某些情况下,例如管理文件句柄、套接字等非内存资源,或者需要自定义释放逻辑时,删除器就显得尤为重要。
2024-11-28 17:51:06
1189
原创 GDB调试基础
但是用户可以干预监视点的选择:例如硬件监视点数量已达上限,GDB 会自动使用软件监视点,但通过删除一些硬件监视点,可能使新设置的监视点使用硬件模式。中,可以通过多种命令查看内存的内容,包括查看变量的值、内存地址上的数据以及指定内存区域的内容。不仅仅只是单纯打印普通变量的值,最强大的是可以打印你所想的很多复杂的类型相关的数据,还可以打印某功能函数的执行结果。适用于对性能极为敏感的场合,但可能影响结果的准确性。的用法是相同的,当所监视的变量被读取是将会在控制台打印出被读取的值,且程序流程暂停。
2024-11-19 08:28:33
854
原创 C++异常对象及其栈回溯
这里也不卖关子了,其实:当一个异常通过throw被抛出时,其抛出的是该对象的副本,而源对象本身在离开该函数作用域之后便被销毁了(这里指的是开辟在栈上的局部变量,自动管理其生命周期)。也被解退掉,在栈空间的变量生命周期自动结束,资源被回收,而分配在堆上的资源由于程序流程并没有执行到人工释放语句,因此造成内存泄漏。因此,对于普通的函数调用,当结束调用时一般都返回到调用它的主调函数处。函数)存储到栈空间中,并将参数添加到被调函数的栈区中,在被调函数中,函数有两个运行出口,分别是正常依序执行完成以及中途遇见。
2024-11-13 13:28:42
741
原创 C++异常:基本语法
上述示例,Entity的析构函数中进行了一些可能抛出异常的处理操作,而一旦让异常逃出析构函数,则会导致程序意外终止等未定义行为。因此其中一种办法是使用catch(...)吞下所有异常。
2024-11-08 19:43:06
1058
原创 C++:( ͡• ͜ʖ ͡• )详解类型转换运算
有点迷糊了?别急,我们来总结一下:dynamic_cast 主要用于安全地将基类指针或引用转换为派生类指针或引用。如果没有继承关系,dynamic_cast 将无法进行有效的转换,但编译器仍然会允许你写出这样的代码。这意味着就算没有继承关系,dynamic_cast在某些条件下是依然适用的,编译器允许你这么写,但是写上去转型是失败的,这毫无意义。
2024-11-08 18:15:11
1061
原创 C/C++常用编译工具链:GCC,Clang
LLVM(Low Level Virtual Machine)是一个开源的编译器基础设施项目,和GNU一样,它也是一个跨平台的编译器和工具链。由苹果公司在2000年发起的,最初的目标是创建一个可以用于苹果公司内部开发的编译器基础设施。后来,LLVM逐渐发展成为一个独立的开源项目,目前已经成为一个非常流行的编译器基础设施。在性能和功能上,两者都有自己的优势和劣势。GCC在某些方面可能更成熟和稳定,而LLVM则可能在某些方面更快和更灵活。
2024-11-03 15:30:58
1813
原创 Linux:文件系统基础命令扫盲
touch命令的本意是更新文件的时间戳(也就是假装touch了一下文件,将文件的修改时间戳更至最新)。在Windows中,这个操作相信大家不会陌生,我们linux中功能也是与其类似的,但是linux中的功能没有Windows中的强大。后来有人发现touch的副作用是:当用户touch一个不存在的文件时会创建出一个新文件,后来便一发不可收拾,成为了一个最为广泛好用的创建新文件的方法。是回到上次cd之前的目录。可以看到,时间最新的已经排到了第一列,并顺次往下延,越往后文件最近的一次修改时间据现在越长。
2024-10-24 10:19:21
1194
原创 Linux与Windows文件共享:Samba的详细配置(Ubuntu)
Samba是一种在Linux和UNIX系统上实现SMB协议的免费软件,用于局域网内不同计算机之间的文件和打印机共享服务。若使用的为win10及以上系统,则在访问该文件夹时可能会出现因权限问题而无法打开该共享文件夹。添加到 Samba 的用户列表中,并设置该用户的 Samba 密码。该命令会检查Samba配置文件语法以及逻辑上的错误,如果无错误将会显示你的配置文件。通过以下命令启用用户,确保该用户可以登录samba服务。[share]表示的是共享文件夹的别名,之后在Windows上面看到的都是这个名称。
2024-10-19 17:14:08
1694
原创 C++11新特性:lambda表达式
在上述的示例代码中,各位可能已经发现,尽管lambda表达式也叫做匿名局部函数,但是我们却把匿名的lambda表达式直接赋予给了一个auto类型的具名变量,这是否说明lambda表达式一定是具有某种类型的?非必要的情况下对大型对象的捕获不应使用pass-by-value的方式,因为大型对象的拷贝十分昂贵,值捕获会导致不必要的拷贝而影响运行效率。在C++11新标准中,引入了lambda表达式的概念,将函数式编程的思想融入到了c++这门语言中,同时也使得用户能够在c++中定义匿名的函数对象。
2024-10-18 18:12:56
1252
原创 C++:错误代码分析<2>
根据代码,理想输出应是打印10行字符串,每行的字符串都是:"Do some work"。当该线程获得锁后,其它线程由于无法获得锁,因此就算分得时间切片也无法执行。当每次运行程序时,操作系统都会根据自身的调度策略,调整线程的执行顺序,因而会造成每次执行程序时,看到的输出结果都不相同。该段代码定义了一个动态存储线程(thread)的vector容器,并向其中压入了10个线程任务,每个线程任务都是执行。待线程全部启动后通过基于范围的for循环遍历该vector容器,将所有线程的运行结果通过join进行回收。
2024-10-13 15:57:14
859
原创 C++11新特性:详解auto关键字
auto是用于简化问题,简化代码提高效率的,而不应该被滥用!过分使用auto有时候反而会使得代码不明了,变得更不易读,违背了使用的初衷。尤其是对于基本类型以及在代码一些关键功能实现部分,有时候能够一眼看出类型的代码远远优于在一堆auto中追根溯源的代码(于人于己都好)。
2024-10-08 21:33:16
1308
原创 C++11新特性:final与override关键字
上述例中,我们所期望的是重写基类中的function函数,但是由于无意间的参数错误,导致我们所期望的函数并没有被重写,而编译器却并没有给出任何错误警告,如果一直没有察觉这个潜藏的错误,后果可能不堪设想。问题的答案是肯定的。而在其某一级派生类中,我们发现其功能已经趋于圆满了,不需要再对其进行重写了,此时便可以使用final将其约束起来,防止其下的派生类无意之间对其进行了修改。这两个新特性的引入进一步加强了面向对象编程中的继承机制,提升代码的可读性和安全性,同时也能很好的防止在类编程中的一些潜在的问题。
2024-10-05 10:14:37
1118
2
原创 C++11新特性:详解委托构造与继承构造
顾名思义,委托构造函数允许一个构造函数调用同类中的另一个构造函数来执行部分或全部的构造工作。这种设计模式避免了代码重复,尤其在类中有多个构造函数时,可以减少冗余代码。正如其名所言,对于构造中有重复交叉的部分,用户可以将重复的这一部分工作委托给一个特定的构造函数进行完成。
2024-10-04 16:30:56
1509
2
原创 MySql学习笔记:什么是数据库?
数据库是一个按数据的结构来存储和管理数据的计算机系统,也就是说,数据库通常有两方面含义:保管数据的“仓库”以及管理数据的技术与方法。由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,有大量的社区支持和丰富的文档资源。数据库的核心目标是以结构化的方式存储数据,以便能够方便、快速、安全地查询和管理这些数据。(以上是一个KV键值存储的数据实例:在这个例子中,我们有三个用户的数据,每个用户的数据都以键值对的形式存储。:数据库可以快速查询存储的数据,满足不同的业务需求。组成,行代表具体的记录,列代表属性。
2024-10-01 11:07:14
1449
原创 C++错误代码经验分享<1>
因此,我们现在明白:x被auto推导为了const char** 类型,是一个指向指针的指针,所以才会出现,直接将该指针传入打印出来的是一个地址而不是该地址所指向的那个字符串。而我们知道,当空间被成功分配后,new返回的则是一个该类型的指针,在此处,被分配的类型是一个常量字符指针。为什么会是这种结果呢?若是第一段代码没有判断出来的朋友,很可能就是由于想当然的将x的类型推导为。很简单,想要对第一层指针直接操纵,直接解一次引用即可。再来考虑下面一段代码会输出什么。下图简略说明了之间的关系。,即等同于下列语句。
2024-09-25 16:53:43
448
原创 C++11:原始字符串字面量
并对其进行了一定程度上的格式控制。但很明显可以看出,这种写法不仅使可读性大大降低,而且由于转义符的原因,很可能会导致一些潜在的问题。尽管此种格式错误很容易被察觉,但是可读性的大大降低也会导致效率受影响。而这一特性可以使用户更加直观的对字符串文本进行更精准的格式控制,同时大大提升了代码的。上述尽管输出结果相同,也可以很明显看出原始字符串字面量的优势。当需要控制的文本更多时,其优势将会更加明显。:是一个可选的定界符,帮助区分字面量的起始和结束。在C++11中,引入了不少实用的新功能。只有一行,就是这么简单。
2024-09-23 08:30:22
574
原创 C++资源管理浅谈
程序上也是一样的,用户不断向系统索取资源,而不将其进行释放归还给系统,久而久之,系统表现愈来愈差,最后便可能会崩溃,卡住。但是在栈区上却并非如此,我们不需要手动在栈区上分配空间,更不需要手动释放,而这一切都得利于栈空间中的自动内存管理模式:由系统全权管理,局部变量通常在栈上分配,函数执行完毕时,栈帧自动销毁,释放内存。RAII的核心思想是将资源(如内存、文件句柄、锁等)的获取和释放与对象的生命周期绑定,从而避免手动管理资源可能引发的问题,如资源泄漏或不正确的释放。离开其作用域时,它会自动释放所拥有的内存。
2024-09-15 16:26:29
1478
原创 C语言代码片段查错<一>
请考虑以上代码。这是一段文件读取操作代码片段,目的是将文件流指针fp所指向的文件中的数据进行读取并存储到arr数组中,计算总和,并打印读取到的数据。,因此当读取时fscanf函数读取不到数据,导致判断为假,从而出现错误。 之前的代码进行了文件写入,将数据写入到临时文件之中。,导致循环体内代码不被执行,从而得出非预期结果。
2024-09-09 11:14:17
566
原创 C语言随机数生成
无论是为了模拟真实世界的一些规律和现象(例如用于密码学生成密钥,天气变化,人口分布,乃至日常的掷色子,扑克牌等),还是创建一些随机数据进行程序测试,均离不开随机数。而最小库则是对其进行精简,只保留了最常用的部分,如果只想要代码量少,但是生成质量高的随机数生成器,那么最小库则是最佳选择。其实是一个伪随机数生成器。也就是说,其功能的实现是通过一个具体的计算式,将传入的种子值经过计算而输出的。PCG库是一个高性能的伪随机数生成库,相较于标准库中的rand()而言,其具有更强大的性能,生成的随机数质量也较高。
2024-09-08 10:32:01
2357
原创 C++禁用编译器默认函数
想像一下,在一个程序中,我们需要一个学生类来描述学生对象。我们都知道,对于一个人而言,尽管部分特征可能与他人有吻合之处,但是主要还是体现差别,每个人都是独一无二的。然而这却带来一个困境:我们不希望实现拷贝操作,所以我们并不打算对相关函数进行声明,但是编译器会自动对其进行生成,因此为了阻止编译器的行为,我们手动对函数进行声明,那也就意味着我们的class支持拷贝,但是我们的目标却是阻止拷贝!这是个不错的想法,也看似可行。此处我们声明了一个空类,但是我们知道,在这个类经过C++处理之后就不再是一个空类了。
2024-09-06 10:21:35
585
原创 一文搞定C语言文件常规I/O操作
文件指针可对其指向的文件进行文件操作。FILE是一个结构体类型,因此其定义的指针也是指向结构体的,其中包含了文件名,文件状态,当前方位指针等等数据。只要用户不重新分配,文件指针的值是不会改变的,一直指向该文件。这里不去深究其中的细节,只需要了解FILE是一个结构体类型,以及如何定义一个指向文件的指针既可。
2024-08-17 13:56:02
958
原创 C++继承与多态简易练习
设计一个简单的银行账户管理系统。类可能会有存款利息计算功能,而。类可能会有支票手续费的计算功能。类派生出两个具体的账户类。,分别实现不同的存取款方式。
2024-08-11 14:06:02
245
原创 C语言链表训练——简易学生信息管理系统
由用户输入一个学生编号来对链表中的学生信息进行查询,若用户输入的编号合理,则遍历整个链表直到找到相匹配的结点,并输出其学生的个人数据。若用户输入不合理,则给出相应提示,并返回到重新输入,直到用户输入正确编号或退回主菜单。由于要实现的效果是依序往后添加学生信息,因此我们先调用countlist函数获取目前链表的结点数目后,将工作指针指向最后一位结点。NewList的函数用于新建一个链表,其调用放在了主函数中最靠前的位置,用于初始化一个默认链表,后续的所有操作将在基于这个链表的基础之上进行。
2024-08-05 16:38:50
505
原创 C语言简易扑克牌发牌器
此代码中,其实对扑克牌的初始化(即Init()函数)是非必要的,不影响代码的正常运行。原因在于Mix函数功能是相邻扑克牌两两取随机数后进行互换,当循环结束后每张牌都被赋予了对应的值,也就相当于初始化了。但是每个人有不同的混牌方式,如果你所采用的方式有遍及不到54张扑克牌的可能,则应当提前对54张牌进行初始化。这里我写上作为一个参考。
2024-07-26 21:41:17
515
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人