自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++:Traits编程技法在STL迭代器中的应用

本文介绍了《STL源码剖析》中的迭代器章节的大部分内容,在原著的基础上加入了自己的理解。

2024-06-07 17:45:27 1045

原创 C语法复习

C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。int arr[];// 柔性数组成员柔性数组是可以被指针替换的。int *p_a;方便内存释放。只需要释放结构体的空间即可,而指针的方案则需要先释放指针指向的空间,再释放结构体的空间。有利于提高访问速度,减少内存碎片。(牵强)__FILE__ // 进行编译的原文件__LINE__ // 文件当前的行号__DATE__ // 文件进行编译的日期。

2024-10-04 20:12:30 530

原创 C语言结构体

这样的定义就会出问题,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。(对齐数=编译器默认的一个对齐数与该成员变量大小的较小值,VS中默认为8,Linux中gcc没有默认对齐数,对齐数就是成员自身的大小)仔细分析,其实是不行的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的大小就会无穷大,是不合理的。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构。

2024-06-19 18:49:47 313

原创 C语言存储

超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的高位字节内容,保存在内存的高地址处。

2024-06-19 18:49:09 864

原创 C语言操作符

本文将围绕C语言中的多种数据类型,变量和简单的操作符进行介绍,并结合自己的学习过程中的疑惑,来帮助大家更好的理解其内容。本文适用于VS2022,x64配置。可以使用sizeof操作符来计算操作符、变量或表达式的长度,单位是字节。sizeof不仅仅是操作符,同时也是关键字。sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边括号。sizeof后边的表达式不真实参与运算,根据表达式的类型来得出大小。sizeof的计算结果是 size_t 类型,打印时使用%zdint main()

2024-06-17 18:26:32 1141

原创 C语言指针

指针是C语言中十分重要的概念,掌握指针是掌握C语言的基础,本篇将为大家详细介绍C语言中的指针。

2024-06-17 18:25:57 1058

原创 C语言的分支和循环

C语言是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的。如果我们仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。我们可以使⽤ifswitch实现分支结构,使⽤forwhiledo while实现循环结构。分支(或者说选择)和循环语句在C语言中非常重要,只有多写才能检验自己的不足,我在写代码的时候经常会犯各种小错误,比如文中提到的do while语句中没加;while。

2024-06-15 20:17:33 674

原创 C语言中的数据类型和变量以及简单的操作符

本文将围绕C语言中的多种数据类型,变量和简单的操作符进行介绍,并结合自己的学习过程中的疑惑,来帮助大家更好的理解其内容。本文适用于VS2022,x64配置。可以使用sizeof操作符来计算操作符、变量或表达式的长度,单位是字节。sizeof不仅仅是操作符,同时也是关键字。sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边括号。sizeof后边的表达式不真实参与运算,根据表达式的类型来得出大小。sizeof的计算结果是 size_t 类型,打印时使用%zdint main()

2024-06-15 20:17:00 604

原创 C++:特殊类

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。如果单例对象构造十分耗时或者占用很多资源,比如加载插件,初始化网络连接,读取文件等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。

2024-06-15 13:57:19 352

原创 C++:智能指针

内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。指程序使用系统分配的资源,比如套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。由于C++11中引入了异常的概念,而异常会影响执行流,所以有时会导致我们申请的资源得不到释放,从而造成内存泄漏。等从堆中分配的一块内存,用完后必须通过调用相应的。

2024-06-15 13:57:11 1198

原创 C++:多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上=0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。

2024-06-14 22:19:05 417

原创 C++:继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。

2024-06-14 22:18:35 403

原创 C++:lambda表达式和包装器

算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。,生成一个新的可调用对象来“适应”原对象的参数列表。函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象。表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个。函数对象,又称为仿函数,即可以像函数一样使用的对象,就是在类中重载了。

2024-06-14 13:47:07 613

原创 C++:可变模板参数

中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。不是一个递归终止函数,只是一个处理参数包中每一个参数的函数。这种就地展开参数包的方式实现的关键是逗号表达式。前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数包”,它里面包含了0到N(N>=0)个模版参数。数组的过程中就将参数包展开了,这个数组的目的纯粹是为了在数组构造的过程展开参数包。系列的接口,支持模板的可变参数,并且万能引用。

2024-06-14 13:46:56 522

原创 C++:模板初阶

class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具_size(0),{}// 使用析构函数演示:在类中声明,在类外定义~Vector();// 注意:类模板中函数放在类外定义时,需要加模板参数列表if(_pData)

2024-06-13 21:50:04 848

原创 C/C++:内存管理

int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;

2024-06-13 21:49:33 929

原创 C++:右值引用和移动语义

右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?需要注意的是右值是不能取地址的,但是给右值取别名后,会导致右值被存储到特定位置,且可以取到该位置的地址,也就是说例如:不能取字面量10的地址,但是。的两个调用,我们会发现,这里没有调用深拷贝的拷贝构造,而是调用 了移动构造,移动构造中没有新开空间,拷贝数据,所以效率提高了。

2024-06-13 17:46:20 740

原创 C++:列表初始化

文章目录{}初始化std::initializer_listautodecltypenullptr{}初始化在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:struct Point{ int _x; int _y;};int main(){ // 数组初始化 int array1[] = { 1, 2, 3, 4, 5 }; int array2[5] = { 0 }; // 结构体初始化

2024-06-13 17:45:30 478

原创 C++:类和对象(三)

在类和对象阶段,大家可以这样理解:类是对某一类实体(对象)来进行描述的,描述该对象具有哪些属性,哪些方法,描述完成后就形成了一种新的自定义类型,用该自定义类型就可以实例化具体的对象。因为声明的顺序是先_a2,再_a1,所以_a2先初始化,此时_a1的值为随机值,所以_a2的值为随机值,再将_a1初始化为1,所以_a1的值为1。友元函数可以直接访问类的私有成员,他是定义在类外的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加。指针,但是可以在静态成员函数内部创建对象,用对象调用非静态成员函数。

2024-06-12 21:10:55 834

原创 C++:类和对象(二)

这里运行程序会发现程序崩溃,这是因为当我们没有显式实现默认拷贝构造函数时,编译器自动生成的默认拷贝构造函数时按照字节进行的值拷贝,所以s1和s2的_array存储的是同一个地址,而程序结束后,执行析构函数,先对s2进行资源清理,回收了_array指向的地址,而对s1进行资源回收时又想要回收_array指向的地址,同块内存空间被多次释放,导致程序崩溃。运行上面的程序我们可以发现:C++中编译器生成的默认构造函数,对内置类型不做处理,对自定义类型,会调用它的默认构造函数。一旦涉及到资源管理则必须要实现。

2024-06-12 15:40:26 636

原创 Linux:环境变量

比如:我们执行指令时,可以直接输入指令执行,而执行我们编译生成的可执行程序,就需要加上路径才能调用,这就是因为Linux中有一个环境变量存储了一些路径,执行指令时会默认去这些路径查找相应的指令,不需要加路径,而我们自己的程序没有在这些路径下,如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量是可以继承的,子进程的环境变量就是父进程的环境变量,也就是说环境变量具有全局属性。

2024-06-12 11:01:09 702

原创 Linux:进程优先级

中有大量寄存器,进程会将数据交给寄存器进行计算,如果程序运行结束或时间片到了,该运行其他程序了,那么寄存器中的数据就会被全部写入该进程的。运行完的进程会进入等待队列,等全部进程都进入等待队列后,等待队列会变为活跃队列,原来的活跃队列变为等待队列。是比较好理解的,即进程的优先级,或者说就是程序被CPU执行的先后顺序,此值越小,进程的优先级别越高。优先权高的进程有优先执行权利。值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。中的进程,以此循环,就构成了我们所看到的优先级队列。

2024-06-12 11:00:58 968

原创 数据结构:二叉树

在介绍二叉树的基本操作前,需先要创建一棵二叉树,然后才能了解其相关的基本操作。由于二叉树的创建比较难理解,所以我们先手动创建一个链式二叉树,等到本文后面再介绍链式二叉树的创建方法。手动创建链式二叉树:注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式本文后面会介绍。学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二

2024-06-11 19:15:43 912

原创 数据结构:堆和堆排序

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。注意:树形结构中,子树之间不能有交集,否则就不是树形结构节点的度:一个节

2024-06-11 19:14:50 619

原创 Linux:进程状态

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。的运行效率很高,而打印的效率很低,所以在这个进程大部分时间都在等待输出,而不是进行计算,所以这就符合我们一开始描述的阻塞状态,没错,睡眠状态就是一种阻塞状态。父进程运行结束后,自己先退出了,而后子进程才运行结束,此时如果不对子进程进行资源释放,子进程就会一直维持僵尸状态,从而造成内存泄漏。需要注意的是:即使是前台运行的进程,在变成暂停状态后也会变成后台进程,而且即使再恢复,也还是后台进程。信号给进程来停止(T)进程。

2024-06-11 15:41:32 836

原创 Linux:进程的概念

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。任何一个进程,在加载到内存,形成真正的进程时,操作系统要先创建描述进程的结构体对象,叫做PCB(Process Ctrl Block:进程控制块),在Linux下的PCB是。在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。我们为什么要在进程中创建子进程呢?

2024-06-11 15:35:41 827

原创 Linux:冯·诺依曼体系结构和操作系统

而内存的速度介于输入输出设备和CPU之间,所以让内存充当输入输出设备和CUP之间的枢纽可以减少资源浪费,在CPU计算的同时,可以将要处理的数据提前加载到内存中,等CPU要处理时可以直接有内存提供数据,极大提高了运算效率。而操作系统为了保证自己内部数据的安全,也为了保证能给用户提供服务,操作系统以接口的方式给用户提供调用的入口,来获取操作系统内部的数据。所有访问操作系统的行为,都只能通过系统调用完成。描述指的是用结构体来存储硬件的各种信息,创建一个结构体对象,通过对该结构体对象的增删查改代表对硬件的管理。

2024-06-10 09:35:21 1012

原创 Linux:基础开发工具

在Linux下安装软件有三种方式:源代码安装、rpm安装、yum安装。源代码安装就是下载程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

2024-06-10 09:35:04 907

原创 C语言:文件操作

磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

2024-06-09 20:46:49 539

原创 C语言:编译链接

静态语义分析通常包括声明和类型的匹配,类型的转换等。就是根据汇编指令和机器指令的对照表一一的进行翻译,也不做指令优化。将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字面量、特殊字符等)。其实翻译环境是由编译和链接两个大的过程组成的,而编译又可以分解成:预处理(有些书也叫预编译)、编译、汇编三个过程。链接是⼀个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。在ANSIC的任何一种实现中,存在两个不同的环境。

2024-06-09 20:46:14 745

原创 C语言:动态内存管理

有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存,我们⼀定会对内存的大小做灵活的调整。当是情况②的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。当时情况①的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。道,那数组的编译时开辟空间的方式就不能满足了。的空间,并返回指向这块空间的指针。

2024-06-09 20:45:40 885

原创 C语言:自定义数据类型——结构体

这样的定义就会出问题,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。(对齐数=编译器默认的一个对齐数与该成员变量大小的较小值,VS中默认为8,Linux中gcc没有默认对齐数,对齐数就是成员自身的大小)仔细分析,其实是不行的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的大小就会无穷大,是不合理的。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构。

2024-06-09 09:26:30 247

原创 C语言:数据在内存中的存储

超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的高位字节内容,保存在内存的高地址处。

2024-06-09 09:25:35 1340

原创 C语言指针详解

指针是C语言中十分重要的概念,掌握指针是掌握C语言的基础,本篇将为大家详细介绍C语言中的指针。

2024-06-09 09:23:24 821

原创 C语言的分支和循环

C语言是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的。如果我们仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。我们可以使⽤ifswitch实现分支结构,使⽤forwhiledo while实现循环结构。分支(或者说选择)和循环语句在C语言中非常重要,只有多写才能检验自己的不足,我在写代码的时候经常会犯各种小错误,比如文中提到的do while语句中没加;while。

2024-06-08 13:23:09 964

原创 C语言中的数据类型和变量以及操作符

本文将围绕C语言中的多种数据类型,变量和简单的操作符进行介绍,并结合自己的学习过程中的疑惑,来帮助大家更好的理解其内容。本文适用于VS2022,x64配置。可以使用sizeof操作符来计算操作符、变量或表达式的长度,单位是字节。sizeof不仅仅是操作符,同时也是关键字。sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边括号。sizeof后边的表达式不真实参与运算,根据表达式的类型来得出大小。sizeof的计算结果是 size_t 类型,打印时使用%zdint main()

2024-06-08 13:22:26 948

原创 Linux:权限

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目录, 即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)为粘滞位,则该目录下的文件只能由root用户或文件的所有者删除。目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目录, 即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)

2024-06-07 17:47:44 1001

原创 C++:多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上=0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。

2024-06-05 16:30:17 1079

原创 Linux:基本指令

指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。如果我们不想清空文件的原内容,想直接在文件末尾追加新内容,那就要用到追加重定向。当目标文件或目标目录不存在时,会将源文件或目录移动,然后重命名为目标文件或目录。Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个结点都是目录或文件。注:如果文件不存在,则会创建新文件。

2024-06-05 16:29:52 2187

原创 C++:继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。

2024-06-01 22:17:56 839

空空如也

空空如也

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

TA关注的人

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