- 博客(197)
- 收藏
- 关注
原创 【C++语言】unordered 系列关联式容器
unordered_map 是存储 <key,value> 键值对的关联式容器,其允许通过 keys 快速的索引到与其对应的 value。在 unordered_map 中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对 <key,value> 按照任何特定的顺序排序,为了能在常数范围内找到 key 所对应的 value,unordered_map 将相同哈希值的键值对放在相同的桶中。
2025-03-21 15:24:48
637
原创 【C++语言】继承和多态常见的面试问题
重载(Overloading)定义:在同一个作用域中,允许定义多个同名函数或方法,只要它们的参数列表不同(参数类型、参数个数或参数顺序不同)。特点重载发生在同一个类中或同一命名空间中。编译器根据参数列表来区分不同的重载版本。什么是抽象类?抽象类(Abstract Class)是一个不能被实例化的类,它通常包含一个或多个纯虚函数(Pure Virtual Function)。纯虚函数是一个没有实现的虚函数,其作用是为派生类提供一个接口规范。
2025-03-20 21:59:23
553
原创 【C语言】实用调试技巧
Debug通常称为调试版本,他包含调试信息,并且不作任何优化,便于程序员调试程序Release称为发布版本,他往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用最常用的几个快捷键:F5:启动调试,经常用来直接跳到下一个断点处F9:创建断点和取消断点断点的重要作用:可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
2025-03-20 20:10:42
817
原创 【C++知识点】知识点
D:错误,map中key是唯一的,每个key都有与之对应的value,经常需要通过key获取value,因此 map为了形象简 单重载了[]运算符, multimap中key是可以重复的,如果重载了[]运算符,给定 一个key时,就没有办法返回 value了,因此,multimap中没有重载[]运算符。this指针在非静态的成员函数里面,对象不存在。A.栈区主要存在局部变量和函数参数,其空间的管理由编译器自动完成,无需手动控制,堆区是自己申请的空间,在不需 要时需要手动释放。
2025-03-19 21:10:46
817
原创 【数据结构】栈和队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出,入队列:进行插入操作的一端称为队尾,出队列:进行删除操作的一端称为队头。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更加优一些,因为数组在尾上插入数据的代价比较小。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据在栈顶。
2025-03-15 22:03:14
341
原创 【数据结构】顺序表和链表
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表,链表,栈,队列,字符串线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构中并一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2025-03-15 21:47:38
478
原创 【C++语言】特殊类设计
C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器除掉该默认成员函数。只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单了,而且如果定义了就不会防止成员函数内部拷贝了。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就介意不能禁止拷贝了。
2025-03-15 20:39:49
312
原创 【C++语言】二叉树进阶
对有n个节点的二叉搜索树,若每一个元素查找的概率相等,则二叉搜索树平均查找长度是节点在二叉搜索树的深度的函数,即节点越深,则比较的次数越多。情况d:在他的右子树中寻找中序下的第一个节点(关键码最小),用他的值填补到被删除节点中,再来处理该节点的删除问题——替换法删除。情况b:删除该节点且使被删除节点的双亲节点指向被删除节点的左孩子节点——直接删除。情况c:删除该节点且使被删除节点的双亲节点指向被删除节点的右孩子节点——直接删除。树不为空,则先按二叉搜索树性质查找插入位置,插入新节点。
2025-03-15 15:57:11
240
原创 【C++语言】继承
{};一般不使用多继承继承和组合继承是一种 is-a 的关系,也就是说每一个派生类对象都有一基类对象组合是一种 has-a 的关系,假设B组合A,每一个B对象中都有一个A对象优先使用组合,而不是类继承继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用,在继承方式中,基类的内部细节对子类可见,继承一定程度破坏了基类的封装,基类的改变对派生类有很大的影响,派生类和基类间的依赖关系很强,耦合度高。
2025-03-15 15:11:31
683
原创 【C++语言】stack和queue
队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一段插入元素,另一端提取元素队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供了一组特定的成员函数来访问其元素,元素从队尾入队列,从队头出队列底层容器可以是标准容器类模版之一,也可以是其他专门设计的容器类。该底层容器应该至少支持以下操作:empty:检查队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。
2025-03-15 12:47:16
933
原创 【C++语言】list
1.1 list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每一个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list和forward_list非常相似:最主要的不同在于forward_list是单链表,只能超前迭代,其更简单高效。与其他的序列式容器相比,list通常在任意位置进行插入,移除元素的执行效率更好。
2025-03-14 11:38:54
256
原创 【C++语言】vector
reserve只负责开辟空间,如何确定知道需要使用多少空间,reserve可以缓解vector增容的代价缺陷问题resize在开空间的同时还会进行初始化,影响size。
2025-03-13 20:46:13
622
原创 【C++面经】
在C++中,set是一个基于红黑树的有序容器,存储唯一的元素,并且默认情况下按照元素的 < 运算符来进行排序。自定义类型的比较函数:由于set需要知道如何比较元素以保持有序,你需要提供一个比较函数或者重载 < 运算符来决定元素的排序。保证元素的唯一性:set会确保所有元素是唯一的,因此你需要确保元素的相等性(==运算符)是正确实现的。构造函数委托是C++11引入的一项特性,允许一个构造函数调用另一个构造函数来简化代码,避免重复代码。在构造函数委托中,一个构造函数可以直接调用同一个类中的另一个构造函数。
2025-03-11 21:05:07
633
原创 【实习面试】处女面
入度和出度是图论中的两个基本概念,用来描述途中节点和其他节点的关系,特别是在有向图中,入度和出度用来表示节点的连接情况。进程:进程是操作系统分配资源的基本单位,他是正在运行的程序实。每一个进程有自己的独立内存空间、数据、堆栈等资源。线程:线程是进程中的执行单元,也叫做轻量级进程。线程共享进程的资源(比如内存空间),但是每一个线程有自己的堆栈和寄存器。:按钮控件,通常用于触发事件。QLabel:标签控件,通常用于显示文本或图像。QLineEdit:单行文本框,允许用户输入一行文本。QTextEdit。
2025-03-10 19:58:47
653
1
原创 C++方向的面经
信号和槽的参数个数必须一致。如果信号有多个参数,槽也必须有相同的参数个数。如果参数个数不匹配,Qt 会发出警告并且不会成功连接信号与槽。可以通过默认参数、QVariant或者 Lambda 函数来处理不同数量的参数。参数的类型必须匹配,或者能够进行隐式转换。分包和粘包问题是由于 TCP 的字节流特性导致的,可以通过数据包头部长度字段、分隔符等方式来解决。丢包可能是由于网络拥堵或设备故障引起的,但 TCP 提供了重传机制来确保数据的可靠性。抓包。
2025-03-05 21:22:41
911
原创 【C++语言】string 类
C语言中,字符串是以 “\0” 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些 str 系列的库函数,但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户自己管理,有可能会发生越界访问。
2025-02-20 21:49:14
683
原创 【C++语言】初识模版
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)
2025-02-11 10:27:02
420
原创 【C++语言】C++入门
定义命名空间,需要使用到 namespace 关键字,后面跟着命名空间的名字,然后接一对 { } 即可,{ } 中即为命名空间的成员。// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个。
2025-02-10 14:22:01
1080
原创 【go语言】protobuf 和 grpc
这对 Go 开发者来说是非常重要的,因为它确保了生成的 Go 代码能够正确地与其他 Go 代码进行集成。在进行编写 proto 文件的时候,我们需要将编号和变量一一对应,不能出现在不同目录下的同一个proto 文件出现不对等的情况,否则会出现一些错误。生成 go 代码时,protoc 会根据 go_package 选项来决定生成的 go 文件的路径。:Go 代码会根据这个选项来决定生成的 Go 文件放置的路径和包名,确保代码结构符合 Go 项目的标准结构。文件中指定生成的 Go 代码的包路径。
2025-02-03 10:25:21
974
1
原创 【go语言】grpc 快速入门
gRPC 是由 Google 开发的一个高效、开源的远程过程调用(RPC)框架,用于在分布式系统中进行通信。它是基于 HTTP/2 协议,支持多种语言,能够让不同的系统或应用程序(即使使用不同的编程语言)进行高效的通信。
2025-02-02 11:52:17
1277
1
原创 【go语言】接口
在Go语言中,接口(interface)是一个非常重要的概念,它定义了一组方法的集合。实现一个接口的类型,只需要提供该接口中所有方法的实现,无需显式声明“实现了某接口”,Go会自动推断。Method1() // 方法1的签名Method2() // 方法2的签名// 可以有多个方法type关键字用于定义类型;是接口的名称;interface是Go的关键字,用于定义接口;接口中的方法签名不包含实现,只有方法的名称和参数/返回值列表。
2025-01-30 13:45:20
1321
原创 【go语言】gorm 快速入门
ORM(,Object-Relational Mapping)是一种程序设计技术,用于在关系型数据库和面向对象编程语言之间进行转换和映射。ORM 允许开发者通过面向对象的方式与数据库交互,而无需直接编写复杂的 SQL 查询语句。
2025-01-30 10:36:18
805
原创 【go语言】指针
在 Go 中,指针通过来声明,它指向某种类型的变量。用于声明指针类型。用于取变量的地址(即获取指针)。var ptr *int = &a // ptr 是指向 a 的指针fmt.Println("a 的值:", a)fmt.Println("ptr 指向的地址:", ptr) // 输出 a 的地址fmt.Println("ptr 指向的值:", *ptr) // 输出 a 的值:声明一个ptr变量,类型为指向int的指针。&a:取a的地址,并将其赋值给指针ptr。*ptr:解引用,获取。
2025-01-29 21:40:50
1415
1
原创 【go语言】结构体
type也可以用来定义结构体类型,这种类型用于存储多个字段(数据)。// 定义一个结构体类型Age int// 创建一个 Person 类型的实例fmt.Println(p) // 输出 {Alice 30}type还可以用来定义函数类型,特别是在回调函数或接口方法中非常有用。// 定义一个函数类型// 使用函数类型fmt.Println(add(3, 5)) // 输出 8在这个例子中,AddFunc是一个函数类型,它定义了一个接收两个int参数并返回一个int类型结果的函数。type。
2025-01-29 21:19:55
1024
原创 【go语言】函数
在 go 语言中,函数是代码块的集合,用于执行特定任务或者计算。函数接受输入(成为参数),执行操作并返回输出(称为返回值)。go 语言中的函数定义非常简单且灵活。在 go 语言中,函数通过 func 关键字定义。func:用于声明函数。:函数的名字,通常首字母大写表示公开(exported)函数,首字母小写表示私有(unexported)函数。:参数列表(可选),参数使用name type的格式。多个参数之间用逗号分隔。returnType:返回值类型(可选)。如果函数没有返回值,则省略。
2025-01-29 10:55:36
1339
原创 【go语言】并发编程
是一个用于描述程序中操作之间因果顺序的规则。在并发编程中,happen-before 机制定义了如何确保一个操作在另一个操作之前发生,并且保证一个操作的结果能够对其他操作可见。具体而言,程序顺序规则(Program Order Rule):在同一个 goroutine 内,代码的执行顺序是保证的,即一个操作发生在前一个操作之后。同步规则(Synchronization Rule):一个 goroutine 对 channel 的发送操作(ch <- x。
2025-01-27 18:52:03
1341
原创 【go语言】map 和 list
/ map 集合,保存数据的一种结构// 创建一个map,也是一个变量,数据类型是 mapvar map1 map[int]string // 只是声明了但是没有初始化,不能使用 nil// 更多的时候使用的是make方法创建var map2 = make(map[string]string) // 创建了map// 在创建的时候,添加一些基础数据// 关于map的类型,就如定义的一般 map[string]int// 类型主要是传参要确定Slice(切片)slice。
2025-01-25 21:12:34
1445
1
原创 【go语言】数组和切片
在 go 语言中,数值是值类型。这意味着,当你将一个数组赋值给另一个数组时,go 会创建一个副本,而不是引用同一块内存。这是与引用类型(比如切片、slice、映射 map、通道 channel)的区别之一。arr1 := [3]int{1, 2, 3} // 创建一个数组arr2 := arr1 // 将 arr1 赋值给 arr2arr2[0] = 100 // 修改 arr2 的第一个元素fmt.Println("arr1:", arr1) // 输出 arr1: [1 2 3]
2025-01-25 19:42:44
1135
原创 【go语言】变量和常量
iota是Go语言中的一个非常有用的工具,简化了常量的定义,特别是在需要递增或生成一组值时。在IOTA的Go语言实现中,iota通常不会直接用于IOTA协议本身,但可以在一些常量的定义中使用,比如网络协议类型、交易状态标识等。
2025-01-22 23:57:33
1177
原创 【C++语言】多线程相关
并发强调的是系统可以在同一时间段内处理多个任务,但并不一定要求同时执行;而并行则是要求在同一时刻执行多个任务。并发可以在单核 CPU 上实现,而并行通常需要多核 CPU 或分布式系统支持。
2025-01-10 16:19:35
967
原创 【C++语言】C++的 IO 流
在C语言中,如果想要将一个整形变量的数据转换为字符串格式,如何去做?使用 itoa() 函数使用 sprintf() 函数但是这两个函数在转化时,都需要先给出保存结果的空间,那空间要给多大呢?就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。itoa()函数介绍itoa()函数用于将整数转换为字符串。不过需要注意的是,itoa()不是 C++ 标准库的一部分,它是一些 C 编译器(如 Turbo C)的非标准函数。
2025-01-10 13:58:58
660
原创 【C++语言】智能指针
什么是内存泄露:内存泄露指的是因为疏忽或者错误造成程序未能释放已经不再使用的内存的情况。内存泄露并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏(Memory Leak)是指程序在运行过程中,动态分配的内存(通常是通过malloc或new等函数分配的内存)没有及时释放,导致这些内存区域无法被回收,从而占用了系统资源,可能会导致系统性能下降,甚至崩溃。2.1.1 内存泄漏的原理:动态内存分配:当程序通过某种方式(如malloc()
2025-01-09 11:23:47
657
原创 【C++语言】异常
这一部分就是对异常抛出和规范的第五条补充,实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛出异常,那么外城的调用者基本就没有办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;
2025-01-05 10:50:09
937
原创 【C++语言】AVL树
在 AVL 树节点的定义中也需要使用三叉链结构,因为我们在进行旋转的时候需要使用其父亲节点。这 AVL 树中也需要使用平衡因子,平衡因子的作用是防止每一个子树中左右子树的高度之差小于等于1。// 三插链// 平衡因子int m_bf;// 构造函数, m_bf(0), m_kv(kv){}
2024-12-29 16:57:21
844
原创 【C++语言】map 和 set
set 是按照一定次序存储元素的容器。在 set 中,元素的 value 也标识它(value 就是 key,类型为T),并且每一个 value 必须是唯一的。set 中的元素不能在容器中修改(元素总是 const),但是可以从容器中插入或者删除他们。在内部,std::set 中的元素总是按照其内部比较对象(类型比较)所指示的特定严格强弱标准进行排序。set 容器通过 key 访问单个元素的速度通常比 unordered_set 容器慢,但是他们允许根据顺序对子集进行直接迭代。
2024-12-26 01:29:44
808
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人