自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文带你学会函数模板——手撕list

本文介绍了基于C++函数模板实现STL list容器的基本原理。主要内容包括:1) 函数模板基础,解释模板参数化机制;2) list结构设计,包含节点类模板、带头双向循环链表实现及自定义迭代器类;3) 完整代码实现,涵盖构造函数、迭代器、插入删除等核心操作。通过模板技术实现了通用链表容器,支持任意数据类型存储,并模拟指针行为设计迭代器类,最终完成了具有标准库风格的list容器实现。

2025-06-03 00:08:35 1008

原创 搞懂C++第五步——从vector与list到泛型编程

C++ STL通过泛型编程实现了零成本抽象,其核心是容器、算法和迭代器的协作设计。容器(如vector/list)使用模板实现类型无关存储,提供统一接口;迭代器作为通用指针连接容器与算法,屏蔽底层差异;算法基于迭代器实现操作泛化。STL完美融合封装与泛型:既隐藏了不同容器的实现细节(如动态数组/链表),又通过编译期模板实例化保证了原生性能。这种设计实现了算法与数据结构的解耦,显著提高了代码复用率和系统扩展性。

2025-05-28 23:02:38 1088

原创 轻松搞定差分数组

差分数组是一种高效处理数组区间操作的技术。它通过存储相邻元素的差值,将区间更新的时间复杂度从O(n)优化到O(1)。差分数组的核心在于:对区间[left,right]加val,只需修改差分数组的left和right+1位置。应用实例如LeetCode 1109航班预订统计问题,通过差分数组可快速计算航班座位数。使用需注意边界处理、初始化和前缀和还原等细节。差分数组特别适合处理大规模数据的频繁区间更新操作。

2025-05-24 23:02:53 614

原创 搞懂C++第四步——string

本文探讨了C++中std::string的底层实现与优化策略。首先,std::string的底层结构基于动态数组,核心数据成员包括数据指针、字符数和容量,并利用短字符串优化(SSO)减少小字符串的内存分配。其次,文章详细介绍了std::string的构造、拷贝构造和析构函数的实现,强调了内存管理的复杂性。此外,std::string支持下标访问和迭代器操作,迭代器本质上是字符指针的轻量级封装。最后,文章揭示了SSO的字节级优化和内存对齐策略,展示了std::string在性能优化上的精妙设计。通过这些细

2025-05-21 20:22:40 960

原创 搞懂C++第三步——new个对象

本文介绍了在c++中的内存与其管理方法。栈:用于局部变量,自动管理,速度快但空间有限。堆:用于动态分配,需手动管理,灵活但容易产生碎片。静态存储区:用于全局变量和静态变量。new在堆上创建对象,创建对象时调用构造函数,delete销毁对象,释放空间时会先调用析构。

2025-05-11 23:06:31 645

原创 搞懂C++第二步——默认函数与重载

本文介绍了类中的默认函数成员,运算符重载等,并用日期类进行了简单实现,

2025-05-08 23:08:05 890

原创 搞懂C++第一步——引用&

引用是 C++ 中的一种变量类型,它为已存在的变量起了一个别名。也就是说,引用本质上是某个变量的另一种“身份”。定义引用时使用符号“&编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。

2025-04-23 17:28:24 776

原创 vector函数介绍与实现(迭代器失效)

vector是C++中STL提供的一个容器类,和数组类似,常用于数组大小不可知的情况下来替代数组。vector是为了实现动态数组而产生的容器。头插头删效率低,支持随机访问

2024-01-24 13:16:29 1166

原创 Vim命令行参数与Makefile

在Linux下,​Vim 是一个高度可配置的文本编辑器,旨在非常高效地创建和更改任何类型的文本,它对于我们程序开发者来说,是一件非常好用的工具​makefile是一个非常重要的工具,它可以自动化编译和构建过程,但我们需要先进行编辑

2024-01-21 13:45:58 1395 1

原创 String在VS与Linux下的区别

在内存中存储时只有一个字符串,不过这个字符串每次都会多开12个字节,前4个存size,中间4个存capacity,后4个存引用计数。需要改变数据时偏移相应的字节,转成int*后解引用。这个指针指向字符串的开始,即这12个字节后。写时拷贝:有时拷贝时不去写(修改),就不会去重新拷贝,只有当写 时,才会拷贝;如果不写,则不用拷贝(提高效率)。每当创建一个string对象时,编译器就会检查当前字符串的大小,运行程序后,打印结果为 8,所以。Windows系统下会开辟。可以减少小字符串的内存开销,

2024-01-20 20:41:00 574

原创 Linux基本指令与权限了解

对于 ls,pwd,cd,touch,mkdir,rm,我们只需要简单了解,因为这些经常使用,对于剩下的不常用的,我们应进行练习

2023-11-17 13:03:29 258

原创 C++模板介绍

C++模板是一种泛型编程的基础,它允许你以一种独立于任何特定类型的方式编写代码。模板可以看作是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念

2023-11-12 15:42:44 101

原创 c++类与对象详解

对于内置类型(如int,double等)在类中不会被自动初始化,即初始值是未定义的对于自定义类型(即自己定义的类或结构体),如果类中有自定义类型的成员变量,那么在创建类的对象时,这个成员变量会自动初始化,编译器会自动调用这个成员变量的默认构造函数,在构造函数中初始化内置类型的成员变量。

2023-11-12 11:20:33 103

原创 c++类的定义

类和结构体都是一种数据类型,类和结构体的主要区别在于它们的默认访问权限。类的默认访问权限是私有的。结构体的默认访问权限是公共的。

2023-10-26 20:05:56 111

原创 c++内联函数

内联函数和宏都是为了提高程序的性能而设计的,内联函数可以递归调用、被重载、被调试器识别、更安全

2023-10-26 19:28:20 75

原创 堆排序、快速排序、希尔排序、插入排序、归并排序、选择排序稳定性与时间复杂度

把第一个元素看做一个有序序列,把后面的元素看做未排序序列,控制[0,end]有序 使用双层循环,外层遍历数组,内层把当前元素插入的相应的位置,并进行移动。为了避免这种情况,可以使用三数取中来选择基准元素(第一个与最后一个元素的中间元素为基准值),可以提高快速排序的效率,但并不能完全避免最坏的情况,如有大量重复元素。选定一个基准元素,这个元素位置为坑,右边找小,左边找大,找到的话交换元素,新位置则为坑位,一遍走完后,把基准元素的值赋给坑位。

2023-10-19 14:11:11 220

原创 二叉树概念详解

当一个二叉树层数为 h 时,它的前 h-1 层是满的,第 h 层从左至右是连续的。若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:A是B的父节点。:以某节点为根的子树中任一节点都称为该节点的子孙。可以快速找到任何节点的父节点,但如果需要找到一个节点的子节点,需要遍历整个数组。一个节点含有的子树的根节点称为该节点的子节点;在Windows中,我们的c盘即为树的根,文件夹则为根的子节点。从根开始定义起,根为第1层,根的子节点为第2层,以此类推;在Linux中,/ 即为树的根,目录则为根的子节点。

2023-10-07 00:13:50 232

原创 顺序表与链表的逻辑

线性表(linear list)是n个具有相同特性的数据元素的有限序列,它是数据结构的一种。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

2023-07-30 19:46:11 338

原创 算法的时间复杂度和空间复杂度

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。数据在内存中的本质就是增删查改算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。算法效率是指算法完成任务所需的资源(如时间和空间)的多少。一个高效的算法能够在较短的时间内完成任务,同时占用较少的内存空间时间复杂度 是指算法完成任务所需的时间。

2023-07-25 00:59:00 115

原创 程序的编译和链接

_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义int main()return 0;运行结果为main.cpp603:34:581预定义符号是C标准定义的宏定义符号,总共有以上五个我们定义了一个名为 PI 的宏,3.14159则是它的值当预处理器遇到 PI 时,它会用 3.14159 来替换它,如下。

2023-07-22 15:38:42 572 1

原创 文件内容函数详解

使用文件可以将数据直接存储到磁盘上,做到了数据的持久化(如微信聊天记录,购物记录等)函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件。

2023-07-18 13:26:41 648

原创 柔性数组详解

包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大 小,以适应柔性数组的预期大小。在开辟空间时,应 首元素 加上 需要为柔性数组开辟的空间。sizeof 返回的这种结构大小不包括柔性数组的内存。结构中的柔性数组成员前面必须至少一个其他成员。方便内存释放,有利于访问速度。柔性数组可大可小,突出一个。

2023-07-15 13:25:53 72

原创 动态内存开辟

内存分为:栈区,堆区,静态区栈区:存放局部变量,形式参数堆区:动态内存开辟的(静态区:全局变量,静态变量。

2023-07-14 17:40:32 97

原创 自定义类型(结构体,位段,枚举,联合)

自定义类型有:结构体,枚举,联合。

2023-07-14 09:26:58 71

原创 memcpy函数(内存复制)

把ptr指向的前num个字节的内容,设置成我们想要的value值(以字节为单位)如 int arr[]={1,2,3,4,5,6,7,8,9,}会覆盖原数组,不能得到{1,2,1,2,3,4,5,8,9}memcmp内存比较:一对一对字节进行比较。用来处理不相关的,不重叠的内存拷贝,函数是专门处理这种情况的,memset:填充内存块。参数跟memcpy一样。

2023-07-11 14:56:00 242

原创 模拟实现strstr(查找字符串)

【代码】模拟实现strstr(查找字符串)

2023-07-10 17:32:57 98 1

原创 strncpy,strncmp,strncat

相对安全的函数,传参时需要传 想要改变的长度。

2023-07-10 17:08:54 77 1

原创 模拟实现strcat函数(连接字符串)

【代码】模拟实现strcat函数(连接字符串)

2023-07-10 16:58:12 77 1

原创 模拟实现strcmp函数(比较字符串大小)

【代码】模拟实现strcmp函数。

2023-07-10 16:51:29 169 1

原创 模拟实现strcpy(复制字符串)

利用assert函数判断是否为NULL。

2023-07-10 16:43:00 65 1

原创 模拟实现strlen函数(计算字符串长度)

【代码】模拟实现strlen函数。

2023-07-10 16:23:42 146 1

原创 指针和数组

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。2. & 数组名 ,这里的数组名表示整个数组,取出的是整个数组的地址。

2023-07-09 13:52:25 123 1

原创 qsort函数(快速排序) strcmp(比较字符串大小)

/函数指针类型——这个函数指针指向的数,能够比较base指向数组中的两个元素。在返回时直接return strcmp( p1 - p2 );//void* 可以接受任意数据,但不能改变或加减,如++打印结果为 0 1 2 3 4 5 6 7 8 9。//指向了需要排序的数组的第一个元素。//一个元素的大小,单位是字节。适合任意类型数据的排序。

2023-07-07 22:09:12 352 1

原创 函数指针数组

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是有该函数的实现方式直接调用,而是在特定的时间或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。//pf是数组(对应上边的,存放函数指针的数组),&pf是整个数组的地址,而不是首元素的地址。//如计算器,参数均为(int,int),可以放在同一个数组内。函数指针数组:数组的每个元素是函数指针类型。//p就是指向函数指针数组的指针。//函数指针数组的地址。

2023-07-07 21:24:02 143 1

原创 指针数组详解

(&数组名 是整个数组的地址)其余情况(除sizeof)数组名都为数组首元素地址。const在*左边限制的是*p(即指向的字符串),在*右边限制的是p。指针(地址)需要存储起来——存储到变量中,这个变量就被称为指针变量。指针(地址)的大小固定为4/8哥字节(32位平台/64位平台)整形指针——指向整型变量的指针,存放整形变量的地址的指针变量。字符指针——指向字符变量的指针,存放字符变量的地址的指针变量。数组指针——指向数组的指针,存放的是数组的地址的指针变量。地址(编号也称为地址)——一级字符指针的数组。

2023-07-07 08:56:16 505 1

原创 浮点数存储详解

一、S。

2023-06-03 21:09:27 956

原创 猜名次小游戏

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

2023-05-28 02:28:11 67

原创 猜凶手小游戏(c语言)

某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。现在请根据这些信息,写一个程序来确定到底谁是凶手。已知3个人说了真话,1个人说的是假话。只需判断真话的次数为3次即可。

2023-05-28 01:14:22 344 1

原创 c语言实现杨辉三角(数组与递归)

(3)第一行有1个元素,第二行有2个元素,第三行有3个元素……(可以用两个元素来遍历)更容易理解,占用内存相较一维数组较大。如3=1+2,4=3+1,10=4+6。arr[ j-1 ] 与 arr[ j ]即当从前向后遍历时会出现错误,是因为。(2)除最外侧元素外,其他元素都是。和我们预想中对应的数值不一样。从后向前遍历即可避免这个错误。关于上述代码中不易理解的点;最外两侧的元素都是1。

2023-05-28 00:25:13 1301 1

原创 const与 * 的关系

可以改变 *p 指向的值,不可以改变 *p 指向的地址;可以改变 *p 指向的地址,不可以改变 *p 的值;全部变量和静态变量不初始化默认为0;当const 在 * 右边时。当const 在 * 左边时。

2023-05-23 18:24:07 123 1

空空如也

空空如也

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

TA关注的人

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