
C++
文章平均质量分 92
谁在夜里看海.
丢掉幻想,准备斗争!
展开
-
【C++】详解RAII思想与智能指针
上一篇关于异常处理的文章,我们提到,异常处理是存在内存泄漏风险的,由于异常捕获会导致程序运行时执行流的跳转,并且在某些资源释放之前就进行了跳转,此时就会引发内存泄漏。什么是内存泄漏呢?内存泄漏是指程序在运行的过程中,动态分配的内存被占用但没有得到释放,从而导致资源不能被回收,最终可能导致系统性能下降甚至崩溃。原创 2024-11-09 19:34:49 · 4616 阅读 · 66 评论 -
【C++】异常处理机制(对运行时错误的处理)
我们在编写程序的时候不可避免地会造成一些错误,有些错误是编译器可以帮我们找出并纠正的,而有些错误则需要我们自己自行处理。编译器负责静态检测,只能检查代码中明显的语义和语法错误,对于运行时的错误处理则需要我们设置适当的错误处理机制。原创 2024-11-08 15:46:40 · 3340 阅读 · 26 评论 -
【C++】lambda表达式的理解与运用(C++11新特性)
C++11引入了 lambda 函数这个概念,用来快速地构建一个闭包,闭包是函数式编程的一个概念,在函数式编程中使用闭包来实现一些高阶函数。闭包是指一个匿名函数以及它所捕获的上下文环境的组合。闭包允许你在函数中捕获并使用周围作用域的变量,从而实现更灵活的函数行为。使用 lambda 可以带来以下好处:1.通过创建lambda对象,可以快速的构建比如谓词函数这种短小并局部使用的函数。这样可以使这部分,不污染全局命名空间2.通过lambda对象可以快速地创建一个可调用对象。原创 2024-11-07 12:45:07 · 2448 阅读 · 67 评论 -
【C++】对左值引用&右值引用&&的深入理解(右值引用与移动语义)
在区分左右值引用之前,我先补充一下对引用的理解。引用,我们需要了解的是,为什么C语言没有引用,而C++有呢?在C语言中,设计者希望语言保持简单并且支持直接操作内存,因此选择使用指针完成数据的传递,通过指针,C语言可以实现对变量的直接访问和修改;在C++中,引入了更高级抽象机制,引用作为一种高级抽象比指针更安全、易用,并且在实现参数传递和返回值时不需要&、*操作符,更符合直观语义,便于面向对象编程。原创 2024-11-04 19:22:29 · 7930 阅读 · 93 评论 -
【C++】布隆过滤器的概念与特点解析
为了方便用户之间的搜索,某应用不允许用户的id重复,现在用布隆过滤器存储着所有用户id的存储情况,用户注册时如果预输入id已存在,则要求更换id(可能预输入id并不存在,但是发生假阳性误判),由于假阴性误判的杜绝,用户的id一定不会相同(已存在的id肯定不会被误判为不存在,而被新用户注册)A与B有一个哈希值7相同,B的删除会使7的bool值置0,这就会导致A被误判为不存在,即假阴性误判,为了避免这种情况发生,布隆过滤器不允许删除元素。频繁的扩容必然导致内存的浪费,那么面对字符串的存储问题,该怎么解决呢?原创 2024-11-02 15:12:11 · 2902 阅读 · 39 评论 -
【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)
位图只存储数据的状态(即是否存在),而不存储数据本身的值,但是我们仍可以根据位图的位索引位置间接查询到数据本身。比如要记录整数。原创 2024-11-01 19:01:43 · 4949 阅读 · 47 评论 -
【C++】红黑树的Iterator改造以及map&set的模拟实现与封装
前面的博客我们介绍了红黑树的底层原理并手撕了一个自己的红黑树,但是这与库里的红黑树还是差了些意思(博客跳转链接要想实现一个完整的红黑树,我们还得实现迭代器的功能,使其可以访问红黑树的每个节点,方便遍历、修改等操作。实现iterator时,begin和end的定义方式决定了如何遍历树中的元素,那么问题来了,begin和end分别该如何定义呢?我们知道,红黑树是一棵二叉搜索树,它中序遍历的结果是一个有序数列,那么我们可以通过begin获取红黑树中最小的元素,end。原创 2024-10-31 19:07:31 · 3083 阅读 · 28 评论 -
【C++】有关哈希的面试题自测
关于哈希结构的介绍可以看这两篇博客:哈希结构的介绍,哈希冲突的解决办法原创 2024-10-28 15:34:46 · 1726 阅读 · 9 评论 -
【C++】哈希冲突的解决办法:闭散列 与 开散列
上一篇博客提到了,哈希函数的优化可以减小哈希冲突发生的可能性,但无法完全避免。本文就来探讨一下解决哈希冲突的两种常见方法:闭散列和开散列原创 2024-10-28 14:48:20 · 3212 阅读 · 7 评论 -
【C++】unordered关联式容器 与 哈希结构(哈希函数的设计)
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器(set、map、multiset、multimap)在查询时效率可到到 O(logN) ,每次查找都需要比较节点的左右子树,当要查找的数据刚好位于叶子节点处时,就要比较树的高度次,当树的高度较大时,查找效率也不理想。理想的查找效率是:1次就可以将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,它们虽然不能保证每次都能1次找到数据,但是它们需要进行的比较次数比红黑树少的多。原创 2024-10-27 19:41:14 · 2872 阅读 · 4 评论 -
【C++】红黑树万字详解(一文彻底搞懂红黑树的底层逻辑)
红黑树的底层结构在代码实现中使用节点结构体和数来表示。节点结构体 保存每个节点的数据、指向左右子节点、父节点的指针、以及平衡因子;树类管理插入、删除等操作。// 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲T _data;// 节点的值域// 节点的颜色在节点的定义中,我们将节点默认颜色给成红色,这是因为如果定义成黑色的话,根据性质4,每一次插入节点都需要重新调整树,而定义成红色,就只需要在父节点也为红色时进行调整,一定程度上保证了插入的效率。原创 2024-10-24 17:52:52 · 3013 阅读 · 6 评论 -
【C++】AVL树(二叉平衡搜索树,超级详细图解底层原理,一遍就会)
AVL树的底层结构在代码实现中使用节点结构体和数来表示。节点结构体 保存每个节点的数据、指向左右子节点、父节点的指针、以及平衡因子;树类管理插入、删除等操作。原创 2024-10-14 21:36:31 · 3200 阅读 · 2 评论 -
【C++】map详解(键值对的概念,与multimap的不同)
set是一个集合容器,存储的是唯一的元素,元素本身就是它的值,且元素按照某种顺序进行存储。set不允许存储重复元素,常用于去重场景。map是一种键值对容器,存储的是成对的数据(key-value pairs),其中键(key)是唯一的,值(value)可以重复。map主要用于通过键快速访问对应的值。键值对的概念(Key-Value Pair)是指一种数据结构,其中每个数据项都由两个部分组成:键(key)和值(value)。键是唯一的,通过键可以快速找到对应的值。原创 2024-10-10 18:13:24 · 2381 阅读 · 1 评论 -
【C++】set详解(关联式容器、键值对,与multiset的区别)
关联式容器在之前的文章中,我们介绍过STL中的部分容器,比如:vector、list、deque等等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。也是用于存储数据的,但与序列式容器不同的是,其里面存储的是结构的,在数据检索时比序列式容器效率更高。键值对键值对是一种数据结构,用于存储和表示关联数据。SGI-STL中,键值对通常由std::pair来表示,其中first代表键second。树形结构的关联式容器与。原创 2024-10-09 20:41:01 · 1948 阅读 · 2 评论 -
【C++数据结构】二叉搜索树(超详细图解操作过程,超详细讲解代码实现)
有一种查找方法,具有极高的查找效率,时间复杂度仅为 O(logn)。在每一步查找过程中都会将搜索范围减半,这就是二分查找。但是在实际应用中,我们并不经常使用二分查找。这是因为它只能在有序数组或有序数据结构上工作,如果数据是无序的,则需要先进行排序;而且它只适用于数组或连续存储的数据结构中。在实际运用中,我们更常用的是二叉搜索树(Binary Search Tree, BST),其查找时间复杂度也是 O(logn),并且拥有高效的插入和删除操作。原创 2024-07-17 21:15:05 · 4131 阅读 · 1 评论 -
【C++】继承与多态相关11道面试题整理
继承与多态的相关知识点在面试中频繁出现,这里整理了一些常见的面试题,供大家学习参考原创 2024-07-15 17:38:49 · 1774 阅读 · 1 评论 -
【C++】多态相关(多态的概念、定义及原理,虚函数与虚函数表)
多态是面向对象编程中的一个核心概念,它允许不同类的对象通过相同的接口调用来执行不同的行为。通俗点来讲,就是多种形态,去完成某个行为,当不同的对象去完成时会产生出不同的状态。原创 2024-07-12 16:40:16 · 1721 阅读 · 1 评论 -
【C++】菱形继承、菱形虚拟继承、继承与组合
不过继承也有用武之地的,有 些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用 继承,可以用组合,就用组合。,如上面的继承关系,在student和teacher的继承person时使用虚拟继承,即可解决问题。此时就不存在了对_name访问不明确的问题,因为虚拟继承保证在整个继承层次中只存在一份基类的实例。继承是一种“is-a”关系,表示一个类是另一个类的特殊化。原创 2024-05-21 16:28:21 · 1011 阅读 · 0 评论 -
【C++】继承相关(基类与派生类的继承关系以及细节整理)
如图:我们可以看到,student是子类,也叫派生类,他继承的是父类people,也叫基类,而public是继承方式,继承方式也可以是protected、private,和访问限定符是一样的。使用不同的继承方式继承的基类成员的访问权限是不一样的,具体关系可以看下面这张表:可以看出基类的私有成员在派生类中是不可见的,而其他成员的访问方式取决于基类中成员的访问限定符和继承方式。通常情况下,使用 public继承是最常见的方式,因为它保留了基类的接口,并且派生类可以访问基类的公共和受保护成员。原创 2024-05-13 18:58:43 · 2696 阅读 · 1 评论 -
【C++】非类型模版参数以及模版的特化
模版参数分为类型参数与非类型参数类型形参:跟在class或typename后面的参数类型名称。非类型形参:可以是整型、指针、引用、枚举等等。模板特化的作用在一般模板无法满足特定类型或特定值的需求时,提供针对特定类型或特定值的定制化实现。原创 2024-05-08 20:37:33 · 690 阅读 · 1 评论 -
【C++】stack&queue系列力扣刷题日志(232.用栈实现队列、225.用队列实现栈、155.最小栈、牛客JZ31.栈的压入弹出序列、150.逆波兰表达式求值)
熟练掌握stack和queue容器适配器,对解决一些特定问题有很大帮助。以上就是我整理的一些关于栈和队列的oj题解,欢迎在评论区留言,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉原创 2024-04-29 19:03:54 · 1791 阅读 · 0 评论 -
【C++】stack & queue的介绍使用以及模拟实现
stack的文档介绍stack 是一种容器适配器:它专门用于后进先出(LIFO)操作,例如压入和弹出元素。stack 实现了一种简化的接口,只允许在容器的一端进行元素的插入和提取操作。底层容器的封装:stack 封装了一个底层容器,该容器负责实际存储元素。stack 提供了一组特定的成员函数,用于访问其底层容器的元素,并将特定类作为其底层容器,元素在容器的尾部(栈顶)进行压入和弹出操作。底层容器的要求:stack 的底层容器可以是任何标准的容器类模板或者其他特定的容器类。原创 2024-04-29 15:37:54 · 1544 阅读 · 1 评论 -
【C++】手撕list(list的模拟实现)
我们在学习数据结构的时候,学过一个非常好用的结构,叫做带头双向循环链表,它不仅遍历非常地灵活方便,而且插入和删除操作的效率很高,弥补了单链表相较于数组的缺点。我们今天要讲的list模版底层就是带头双向循环链表。原创 2024-04-23 17:37:57 · 2035 阅读 · 0 评论 -
【C++】list的介绍及使用说明
和"std::vector"一样,“std::list”实现不同类型数据的管理也是通过模版类的机制实现的。当创建一个list对象时,可以通过模版参数来指定存储的元素类型。使用""来显式实例化指定存储的元素类型,例如“std::list”表示存储整数类型的链表,“std::list”表示存储双精度浮点型的链表…………return 0;原创 2024-04-18 21:07:31 · 2067 阅读 · 0 评论 -
【C++】理解vector的底层原理并模拟实现(手撕vector)
但是我们不仅要会用,还要理解它的底层原理,今天我们通过手撕一个自己的vector,来进一步加深对vector容器的理解。原创 2024-04-03 18:51:11 · 2064 阅读 · 0 评论 -
【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)
在实际运用中我们要熟悉vector的常见接口,在合适的场景中使用出来原创 2024-04-01 15:43:56 · 1256 阅读 · 0 评论 -
【C++】vector的介绍及使用说明(类模版的实现方式,顺序存储与动态数组,迭代器iterator的运用,vector的增删查改)
类模版"std::vector"实现不同类型数据的管理是通过类模版的机制实现的。当创建一个vector对象时,可以通过模版参数来指定存储的元素类型。使用""来显式实例化指定存储的元素类型,例如“std::vector”表示存储整数类型的向量,“std::vector”表示存储双精度浮点型的向量…………return 0;原创 2024-03-30 21:44:26 · 2371 阅读 · 0 评论 -
【C++】揭开运算符重载的神秘面纱
通过运算符重载,用户可以为自己创建的类或结构体定义与标准运算符相对应的操作,使得这些类型的对象可以使用像内置类型一样的简洁语法来执行操作。例如,对于自定义类Complexpublic:private:在上述例子中,通过重载运算符,我们使得Complex类的对象可以使用运算符执行相应的复数加法,使得代码更加直观和易读。运算符重载是一种强大的编程技术,允许用户定义的类型通过标准运算符执行自定义的操作。通过运算符重载,代码变得更加直观,可读性提高,使得类和对象的使用更加自然。原创 2023-12-22 16:39:43 · 909 阅读 · 0 评论 -
【C++】谈谈深拷贝与浅拷贝
深拷贝是指在对象赋值时,为对象的每一个指针成员分配新的内存,新的内存内存放源对象的副本。两个对象相互独立,对一个对象的修改不会影响到另一个对象。总的来说,深拷贝是一种更安全的拷贝方式,尤其在涉及到动态内存分配时,可以避免悬空指针和内存泄漏的问题。不过,具体选择深拷贝还是浅拷贝取决于具体的需求和对象的结构,有的情况下选择浅拷贝会更合适。原创 2023-12-20 21:37:18 · 470 阅读 · 1 评论 -
【C++】理解string类的核心理念(实现一个自己的string类)
实现自己的string类是学习 C++ 语言和面向对象编程的一个好方法。通过编写一个简单的字符串类,可以深入理解等核心理念。理解了string类的底层逻辑之后会发现,一些在上层看似复杂的操作在底层其实很简单。下面就让我们来实现一个自己的string类吧!原创 2023-12-20 16:43:56 · 1767 阅读 · 0 评论 -
【C++】标准库中的string类
以上只是对string类的初步认识,想要继续深入了解它还需要经过大量的练习以及string类的自我实现,理解了它的底层原理才能更好地运用它,后续我也会继续推出有关string类的自我实现的博客,请期待一波~~原创 2023-12-18 22:34:13 · 1776 阅读 · 0 评论 -
【C++】有关string类对象与迭代器的几道OJ题详解
为什么这里reverse内的参数是begin和x+1-k呢,原因是reverse内部第二个迭代器参数其实指向的是字符串最后一个元素的后一位,而x此时指向的是2k个元素中的第2k个元素,所以需要+1再-k,才能实现对前k个元素的翻转。根据题目要求,首先需要遍历字符串,我们用一个迭代器来实现遍历,还需要记录遍历的个数,用flag表示当遍历了2k个字符时,对前k个进行翻转,翻转的操作我们可以通过库函数。它的作用是创建一个指向字符串最后一个字符的反向迭代器,我们创建一个 it 变量用于接受迭代器的内容。原创 2023-12-18 18:41:30 · 1636 阅读 · 0 评论 -
【C++】STL标准模版库
(standard template libaray-标准模板库):C++编程语言的一个,它提供了一组通用的模板类和函数,以实现常见的数据结构和算法。STL的设计目标是提供一种高效、灵活和通用的编程工具,使C++开发人员能够更轻松地实现各种功能而不必从头开始编写代码。原创 2023-12-16 23:58:58 · 1292 阅读 · 0 评论 -
【C++】模版的介绍与说明(模版实例化,模版参数,类模版)
我们在练习题目的时候总会遇到需要进行数据交换的情景,有时还需要进行多次交换,所以经验丰富的我们会建立一个函数来实现数据的交换,但是每次碰到相应题目都需要手搓一个交换函数,这样的工作显得单调又冗余,那么可不可以实现一个呢?对了,我们不是学过C++的使用函数重载固然可以实现,但是有以下不好的地方:重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。代码的可维护性比较低,一个出错可能所有的重载均出错。原创 2023-12-15 23:59:45 · 747 阅读 · 0 评论 -
【C++】内存泄漏(浅谈一下我对内存泄漏的看法)
C++ 内存泄漏是指在程序运行过程中,动态分配的内存未被正确释放,导致程序占用的内存不断增加,最终可能耗尽系统资源。以上内容涵盖了 C++ 内存管理的多个方面,可以帮助我们更好地理解内存泄漏,希望我们都能写出更加可靠和高效的代码。原创 2023-12-15 23:30:44 · 181 阅读 · 0 评论 -
【C++】内存管理(new和delete的实现原理解析)
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。原创 2023-12-14 16:47:06 · 1836 阅读 · 0 评论 -
【C++】类和对象(构造函数、static成员、友元以及内部类)
定义时不添加static关键字,类中只是声明3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问4. 静态成员函数。原创 2023-12-11 16:22:31 · 1531 阅读 · 0 评论 -
【C++】类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载以及const成员)
默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。原创 2023-11-21 19:56:57 · 1194 阅读 · 0 评论 -
【C++】类和对象(类的定义、访问、作用域、实例化、对象模型以及this指针)
C++中通过类可以将数据以及操作数据的方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。C++中的参数是编译器维护的,C语言中需用用户自己维护。原创 2023-05-30 17:12:18 · 1882 阅读 · 0 评论 -
【C++入门】auto关键字 与 基于范围的for循环(C++11)
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对 第一个类型进行推导,然后用推导出来的类型定义其他变量。auto关键字方便我们声明和定义变量,特别是在变量类型特别复杂的时候C++11推出的新型for循环是基于范围,在一些情形下特别方便好用(有范围的集合)原创 2023-05-30 14:26:39 · 5679 阅读 · 0 评论