自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++11之lambda及包装器

本文介绍了C++11中的两个重要特性:Lambda表达式和function包装器。Lambda表达式是一种匿名函数对象,支持捕获外部变量、参数传递和返回值定义,其底层实现实质上是编译器生成的仿函数类。function包装器是一个通用的可调用对象封装器,能够统一处理函数指针、仿函数、Lambda表达式等多种可调用对象,提供了更灵活的函数调用方式。两者结合使用可以简化代码编写,提高程序的可维护性和扩展性。

2025-07-28 07:32:22 1529 30

原创 C++11之可变参数模板

在我们的示例中,定义了一个参数包Args,它表示Print函数可以接受任意数量和类型的参数。定义了一个参数包Args,它表示Print函数可以接受任意数量和类型的参数。

2025-07-24 08:29:36 1323 24

原创 飞算JavaAI:基于知识库的深度测评,飞算AI 是如何帮助 Java 开发者提升效率的?

别再一行一行写代码了,试试飞算AI,让AI帮你写。

2025-07-22 07:20:17 657 10

原创 C++11之右值引用与移动语义(提高效率)重要

• 左值是⼀个表⽰数据的表达式(如变量名或解引⽤的指针),⼀般是有持久状态,存储在内存中,我们可以获取它的地址,左值可以出现赋值符号的左边,也可以出现在赋值符号右边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。• 右值也是⼀个表⽰数据的表达式,要么是字⾯值常量、要么是表达式求值过程中创建的临时对象等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。• 值得⼀提的是,左值的英⽂简写为lvalue,右值的英⽂简写为rvalue。

2025-07-21 08:17:54 1960 29

原创 C++11之列表初始化,以及initializer_list简介

列表初始化是一种使用花括号{}或者这种方式可以用于初始化各种类型的对象,包括内置类型、类类型、数组等。它旨在提供一种统一的初始化语法,以解决传统初始化方式中存在的问题,如初始化方式不一致、类型安全问题等。是一个模板类,用于表示初始化列表。它提供了一种方便的方式来处理一组同类型的数据。的对象可以通过花括号{}

2025-07-18 07:47:30 1167 26

原创 C++之unordered_xxx基于哈希表(链地址法)的自我实现(难)

Iterator:用于非常量哈希表的迭代器,允许修改元素。:用于常量哈希表的迭代器,不允许修改元素。

2025-07-16 08:52:28 1381 23

原创 C++之哈希表的基本介绍以及其自我实现(开放定址法版本)

当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。比如,在一个存储用户信息的哈希表中,如果用户 ID 是连续的整数,且哈希表大小较小,那么相邻的用户 ID 很可能产生冲突。

2025-07-14 07:36:13 1841 25

原创 C++之unordered_set和unordered_map基本介绍

unordered_set 是一个不包含重复元素的集合容器。它通过哈希函数将元素映射到存储位置,从而实现快速的查找操作。由于元素的存储顺序是根据哈希值确定的,因此 unordered_set 中的元素顺序是无序的。由于unordered_set和set增删查以及使用基本一致,在这里就不做过多赘述unordered_map 是一个键值对的集合,其中每个键都是唯一的。它也基于哈希表实现,通过哈希函数将键映射到存储位置。与 unordered_set 类似unordered_map 中的元素顺序是无序的。

2025-07-10 08:11:07 1876 28

原创 C++之利用红黑树作为底层,实现对set和map的封装(难)

其次因为RBTree实现了泛型不知道T参数导致是K,还是pair<K,V>,那么insert内部进⾏插⼊逻辑⽐较时,就没办法进⾏⽐较,因为pair的默认⽀持的是key和value⼀起参与⽐较,我们需要时的任何时候只⽐较key,所以我们在map和set层分别实现⼀个MapKeyOfT和SetKeyOfT的仿函数传给RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进⾏⽐较。返回一个 pair,其中 first 是一个迭代器,指向插入的节点或已存在的相同键的节点;

2025-07-07 08:53:25 1285 28

原创 C++之红黑树认识与实现

节点是红色或黑色:每个节点都有一个颜色属性,红色或黑色。根节点是黑色:树的根节点必须是黑色。叶子节点是黑色:叶子节点(即空节点或NULL节点)是黑色。红色节点的子节点是黑色:如果一个节点是红色,则它的两个子节点都是黑色。从任意节点到其每个叶子的所有路径都包含相同数量的黑色节点:这确保了树的平衡性。这些性质保证了红黑树在插入和删除操作后能够保持大致平衡,从而使得查找、插入和删除操作的时间复杂度都能保持在(O(log n))。

2025-07-03 08:37:54 4992 24

原创 C++之AVL树的介绍以及AVL树自我实现

AVL树是一种自平衡的二叉查找树,它的名字来源于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。

2025-06-30 13:02:13 1541 30

原创 C++之STL---set及map的基本使用

序列式容器是一种按照元素插入顺序存储数据的容器。元素存储在连续或逻辑上连续的空间中,通过索引或迭代器可以顺序访问每个元素。常见的序列式容器包括数组、向量(vector)、列表(list)、双端队列(deque)等。元素按照插入顺序依次存储。例如,在vector中,元素存储在连续的内存空间中;在list中,元素通过指针或引用连接在一起。存储结构相对简单,主要关注元素的顺序和连续性。关联式容器是一种基于键值对存储数据的容器。

2025-06-26 08:13:39 1803 28

原创 C++之二叉搜索树及其实现

搜索二叉树(Binary Search Tree,简称BST)是一种基础且重要的数据结构,它在查找、插入和删除操作上具有高效性。本文将围绕搜索二叉树的原理,结合C++代码实现,深入探讨这一数据结构的核心特性与具体实现。

2025-06-23 09:40:58 2758 35

原创 C++之多态

多态(Polymorphism)是面向对象编程的三大核心特性之一(封装、继承、多态),源于希腊语"多种形态"。在C++中,它允许我们使用统一的接口处理不同类型的对象,显著提高了代码的灵活性和可扩展性。核心概念同一接口,多种形态不同的对象可以通过相同的方法名调用,但实际执行的逻辑由对象自身的类决定。解耦调用与实现调用者只需关注接口(方法名和参数),无需关心具体实现,提高代码的可扩展性和可维护性。多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。

2025-06-18 10:16:57 2544 38

原创 C++之继承

继承允许我们基于已有的类(基类)创建新类(派生类)。派生类自动获得基类的成员(属性和方法),并可以扩展新的功能。继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。public:protected:string _name = "张三";// 姓名// 地址// 电话// 年龄。

2025-06-16 09:32:42 1577 19

原创 C++之模板进阶

模板的分离编译是一个复杂的问题,主要原因是模板的实例化依赖于具体的类型参数。显式实例化:通过显式指定模板的实例化类型,将模板代码集中到一个编译单元中,减少重复编译和代码膨胀。模板定义与声明分离:将模板的定义放在源文件中,声明放在头文件中,但需要显式实例化,否则可能导致链接错误。内联模板库:将模板的定义和声明全部放在头文件中,简单易用,但会导致编译时间增加和代码膨胀。优点模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性缺陷。

2025-06-14 09:23:53 1413 30

原创 C++之容器适配器介绍 以及 STL--stack queue deque

容器适配器数据结构特点默认底层容器适用场景stackLIFOdeque递归模拟、表达式求值queueFIFOdeque任务调度、广度优先搜索优先级排序vectorheap任务调度(按优先级)、贪心算法选择合适的容器适配器可以提高代码的可读性和性能。在 C++ 中,stack是一种容器适配器,它提供了一种后进先出(Last In First Out,LIFO)的数据结构。它基于底层容器(默认是std::deque,也可以是或std::list等)来存储元素,但只允许在容器的一端(称为栈顶)进行操作。

2025-06-12 08:18:05 1373 12

原创 C++之list的自我实现

{ }// 指向前驱节点// 指向后继节点T _val;// 存储的数据值核心作用:作为链表的基本单元,封装节点数据和指针关系// 封装的节点指针模板参数解析T:节点数据类型Ref:引用类型(T&或const T&)Ptr:指针类型(T或const T// 元素计数器// 哨兵头节点。

2025-06-09 18:55:15 2657 28

原创 C++之STL--list

它在内存中以连续的方式存储元素,支持快速的随机访问,但在插入和删除操作(尤其是非尾部操作)上可能效率较低。迭代器失效是指迭代器不再指向有效的元素,这通常发生在对容器进行修改操作时。它提供了高效的插入和删除操作,非常适合需要频繁动态调整元素的场景。是一个动态容器,其容量会根据元素的添加和删除自动调整。每个元素通过指针(或引用)与前一个元素和后一个元素相连。是一个双向链表,因此它提供的是双向迭代器。:当你删除一个元素时,指向该元素的迭代器会失效。是一个双向链表,插入操作不会影响已有的元素位置。

2025-06-07 13:53:10 1365 30

原创 C++ 之 vector的自我实现

/ it 指向尾后位置// 删除 3// 错误!it 失效,end() 已改变扩容情况:所有迭代器(包括begin()和end())全部失效非扩容情况:插入点及之后的迭代器失效。

2025-06-04 08:39:15 1516 12

原创 C++之动态数组vector

可以通过多种方式定义和初始化。// 定义一个空的 vector// 使用初始化列表初始化// 使用默认值初始化// 10个元素,初始值为0// 复制构造// 从另一个 vector 的一部分构造是 C++ STL 中非常重要的容器之一,它结合了动态数组的灵活性和数组的高效性。通过动态扩展、随机访问和灵活的内存管理,可以满足多种编程需求。在实际开发中,合理使用可以提高代码的可读性和性能。

2025-06-02 09:27:29 2233 46

原创 C++之string的模拟实现

通过手写这个简易版string类,我们深入理解了标准库字符串类的核心机制:动态内存管理、深拷贝实现、迭代器设计、扩容策略等。虽然现代C++编程中应优先使用,但掌握这些底层原理有助于写出更高效、更安全的代码。

2025-05-30 07:16:48 1538 15

原创 C++之string题目练习

leetcode题目链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/description/在编程中,字符串与整数的转换是一个常见的任务。我们将通过分析一个具体的代码实现,来理解其中的关键点和技巧。我们的目标是将字符串中的单词顺序反转,但单词内部的字符顺序保持不变。函数可以实现这一功能,但今天我们通过手动实现一个类似的函数,来加深对这一问题的理解。接下来,我们需要将字符串中的数字字符转换为整数。

2025-05-28 08:46:24 1776 28

原创 C++之STL入门

范围for循环:提供了一种简洁的方式来遍历容器,使代码更加易读。auto关键字:自动推导变量类型,减少显式类型声明的繁琐,尤其在处理复杂类型时非常有用。

2025-05-26 07:27:32 1741 24

原创 C++之STL--string

提供了多种方法来修改字符串的内容,包括插入、删除、替换、直接修改字符等。这些操作使得字符串的编辑变得非常灵活,同时也避免了C语言中直接操作字符数组时可能出现的内存错误。是 C++ STL 中一个非常强大且灵活的工具,它提供了丰富的功能来处理字符串,同时避免了许多传统字符串操作的常见问题。通过掌握的构造、操作、性能优化以及高级用法,你可以更高效地编写字符串处理相关的代码。在实际开发中,合理使用能够大大提高代码的可读性和安全性。

2025-05-23 07:24:05 1852 37

原创 C++之内存分配new与 delete

new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。

2025-05-21 08:01:43 1676 12

原创 C++之函数模板&&类模板

class 类模板名// 类内成员定义在之前自我实现链表时,我们会定义一个datatype是为了适应不同类型的数据,而到了c++这里,模板就可以很好的解决这个问题。

2025-05-19 07:16:17 1695 36

原创 C++动态内存分配

区域存储内容生命周期分配方式访问速度风险/注意事项代码段可执行指令、字面量字符串程序运行期间编译时静态分配最快不可修改(修改会触发段错误)数据段已初始化全局/静态变量程序运行期间编译时静态分配快持续占用内存BSS段未初始化全局/静态变量程序运行期间运行时零初始化快自动清零,节省磁盘空间堆动态分配的对象(mallocnew手动管理(freedelete运行时系统调用(sbrkmmap较慢内存泄漏、碎片化、需手动释放栈局部变量、函数调用帧函数执行期间。

2025-05-16 07:20:23 1344 16

原创 C++类和对象之相关特性

static成员变量和static成员函数是类的静态特性,它们与类本身相关联,而不是与类的对象相关联。static成员变量需要在类的定义外初始化,并且可以通过类名或对象访问。⽤static修饰的成员函数,称之为静态成员函数static成员函数没有this指针,只能访问类的static成员变量和其他static成员函数。⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数。静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。

2025-05-14 10:06:10 1866 12

原创 C++类和对象之初始化列表

初始化列表是构造函数的一部分,用于在对象创建时直接初始化成员变量。它位于构造函数参数列表之后,函数体之前,使用冒号()和逗号()分隔各成员的初始化操作。int& ref;public:// 使用初始化列表的构造函数// 构造函数体⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化成员变量,每个成员变量都要⾛初始化列表初始化;

2025-05-12 00:02:12 1446 45

原创 C++之运算符重载实例(日期类实现)

通过实现Date类,运用了C++中类的设计、运算符重载、构造函数、析构函数等核心概念。日期类的实现不仅涉及到基本的数学计算,还需要处理各种边界情况和逻辑判断。

2025-05-09 10:01:44 2345 39

原创 C++类和对象之运算符重载

运算符重载是 C++ 的一种特性,它允许程序员为自定义类型(如类和结构体)重新定义运算符的行为。通过运算符重载,我们可以使用熟悉的运算符语法来操作自定义类型的对象,从而使代码更加简洁、直观。当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。例如,我们可以为自定义的复数类重载运算符,使得两个复数对象可以直接使用// 使用重载的 + 运算符。

2025-05-07 00:09:07 1962 17

原创 C++类和对象之默认成员函数

这样的语句创建对象obj时,默认构造函数就会被调用。不过需要注意的是,编译器生成的默认构造函数只是对对象的成员进行默认初始化,对于内置类型,其值是未定义的;我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于大多数简单类,默认析构函数就足够了,它会自动调用成员对象的析构函数,释放对象成员占用的资源。如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。

2025-05-05 07:39:29 1369 22

原创 C++之类和对象基础

类是一种用户自定义的数据类型,它将数据(成员变量)和操作这些数据的函数(成员函数)封装在一起,就像一张设计蓝图,定义了某一类事物的属性和行为。C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接提供给外部的⽤⼾使⽤。class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。

2025-05-02 09:00:45 1504 22

原创 C++入门(缺省参数/函数/引用)

C++的存在,弥补了C语言中的很多不足,作为面向对象的语言,在使用上会便利很多。这点的本文中会有很好的体现。缺省参数是指在函数声明或定义中为某些参数指定默认值。当调用该函数时,如果省略了这些参数,编译器会自动使用默认值。缺省参数通常用于提供函数的默认行为,同时允许用户根据需要覆盖这些默认值。Func(20);return 0;

2025-04-30 00:08:43 1458 19

原创 C++入门(namespace/输入输出)

namespace是一种逻辑上的分区,用于将标识符(如变量名、函数名、类名等)分组。通过命名空间,可以将不同的标识符放在不同的作用域中,从而避免命名冲突。简单来说,namespace就像一个容器,将相关的代码封装在一起。int a = 1;int b = 2;以上例子namespace就是一个命名空间,其中包含着a,b变量。• C++标准库都放在⼀个叫std(standard)的命名空间中。上述代码所使用到的cout的函数,就是包括在std这个命名空间当中。

2025-04-28 07:13:36 1485 17

原创 数据结构之排序

希尔排序法的基本思想是:先选定⼀个整数(通常是gap=n/3+1),把待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序,当gap=1时,就相当于直接插⼊排序。直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列。遍历完之后,将最小的数据换到最前,最大的换到最后。

2025-04-25 07:48:45 1695 20

原创 二叉树OJ题目

总体上看,二叉树题目方面运用到达递归的情况较多。所以在做题目之前,可以将函数递归部分先行复习。

2025-04-23 12:08:12 1117 17

原创 二叉树操作与遍历实现

本文通过代码详细介绍了二叉树的创建、遍历、销毁以及一些其他操作的实现。二叉树是一种非常重要的数据结构,在计算机科学中有广泛的应用,如表达式树、决策树等。掌握二叉树的操作对于学习数据结构和算法非常重要。

2025-04-21 21:17:37 1411 23

原创 堆的实现以及利用堆进行排序

堆是一种特殊的完全二叉树,分为最大堆和最小堆。在最小堆中,父节点的值总是小于或等于其子节点的值。这种特性使得堆的根节点始终是所有节点中的最小值,非常适合实现优先队列。堆中某个结点的值总是不⼤于或不⼩于其⽗结点的值;堆总是⼀棵完全⼆叉树。⼆叉树性质对于具有 n 个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的数组顺序对所有结点从0 开始编号,则对于序号为 i 的结点有:若 i>0 , i 位置结点的双亲序号: (i-1)/2;i=0 , i 为根结点编号,⽆双亲结点。

2025-04-18 11:27:55 1514 14

空空如也

空空如也

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

TA关注的人

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